半角スペース&条件分岐

半角スペース&条件分岐

- あ い の投稿
返信数: 6

【文字が半角スペースのときで場合分け(条件分岐)】


https://oversleptabit.com/archives/340


で最後に挙げられているソースを具体例に,一文字ずつ分けて考える際,半角文字を考慮したいときはどうすればよいでしょうか。


\makeatletter

\newcommand{\mkZen}[1]{\@tfor\han:=#1\do{\@zen{\han}}}

\newcommand{\@zen}[1]{%

\if#10{0}%

\else\if#11{1}%

\else\if#1 {置換}%⇦①

\else#1\fi\fi\fi

}

\makeatother

としても,元のソースと変わりませんでした。解決策をご提示いただければ幸いです。

あ い への返信

Re: 半角スペース&条件分岐

- 和田 勇 の投稿

まとまった時間ができた&誰も答えていないので ...

#間違っていたら指摘していただければ幸いです。

  • 「元のソースと変わりません」とのことですが

    「0 1 2 3 4 5」など数値の間に任意の空白を入れても 「01 2345」となりませんか?

    言いたいことは、「変わらない」のではなく「空白が無視されてる」点です。「1」と「2」の間の空白は組版の結果で入っていると思います。

    \newcommand{\mkZen} で $$ などとデバッグコードを挿入すると連続する空白が一個になっているのがわかります。

    また \newcommand{\@zen} にデバッグコードを入れれば、\@tfor で1文字づつ分解されたものが \@zen には渡ってこない=無視されていることがわかります。

    それと \@zen 内の \else\uf#1 {置換} の「{置換} 」の直前 「\elif#1 」も通常状態では意味なさない状態と思われます。

  • 「空白」を今回の意図に応じたように利用するには通常10 に設定されている空白の \catcode を通常文字と同じ 13 (\active) に変更する必要があります。

    • catcode についての情報源

      https://blog.wtsnjp.com/2017/03/31/tex-by-topic2/ TeX by Topic ゼミ (2) カテゴリーコードの研究

    • 取り敢えず以下のように通常「10」に分類されている「空白」のカテゴリコードを「13」に設定することで解消はできると思います。

       
       \mkZen{0   1   2   3   4   5   6   7   8   9  }
       
       
    • 空白のカテゴリコードを 13 のままにしておくと、それ以外のところで意図せずに入力していた空白が「文字として有効」になってしまうので、組版結果に副作用を発生させますので、通常は元に戻してあげる必要があるので、利用直後に 10 に戻しています。
和田 勇 への返信

Re: 半角スペース&条件分岐

- あ い の投稿
和田勇さま,回答ありがとうございます。
ご提示いただいたソースで無事解決することができました。
カテゴリーコードが関係しているのだと知り,とても学びになりました。
本当にありがとうございました。
あ い への返信

Re: 半角スペース&条件分岐

- 阿部 紀行 の投稿
カテゴリーコードの変更なしでも対処できます.@munepixyzさんのツイートを参考にしてください.
https://twitter.com/munepixyz/status/1532950834560266240
(個人的には必要ないならばカテゴリーコードは変更しない方がよいと思っています.)
阿部 紀行 への返信

Re: 半角スペース&条件分岐

- 和田 勇 の投稿
「01 2 34」のように空白が一個ずつだと良いのですが、
連続する空白が2個以上だと一個になってしまいます。

\verb や \verbatim 環境のようにならないかとか、perl とか lua などで tr を利用できないかなとかも検討はしましたが、余計混乱しそうなので断念しました :-(

PS カテゴリーコードの変更は、今回の場合、戻し忘れによる副作用が心配なので、私もできればやりたくない。
和田 勇 への返信

Re: 半角スペース&条件分岐

- 北見 けん の投稿
連続する空白文字を個別に扱いたいのであれば
カテゴリコードの変更が必須ですね。

ただ、
上の例ではカテゴリコードを13にしていますが、
13だと「アクティブ文字」として1文字のマクロになるので、
単に引数として処理するためであれば
12(その他の文字)にするのが普通かと思います。