「ifthen」と「謎の空白」

「ifthen」と「謎の空白」

- あ い の投稿
返信数: 5
ifthenを用いた場合に発生する謎の水平方向の空白について質問です。

otfパッケージを用いずに丸数字(①)を4桁まで出力したいと思い,条件分岐を可能にするifthenを用いて以下のコードを作ってみました。
(コンパイラ:uplatex,機種:MacBook Air)


%documentclass-------------------------------------------------------------------------------

\documentclass[uplatex,dvipdfmx,fleqn]{jsarticle}

%preamble-------------------------------------------------------------------------------------

\usepackage{graphicx,ifthen}

%ifthenのせいかどうかを判断するためのmmaruの定義
\newcommand{\mmaru}[1]{\textcircled{\scalebox{0.9}[0.85]{\raisebox{-0.1em}[0.15em][0em]{#1}}}}

%1桁とそれ以外の丸数字の定義
\newcommand{\subsubmaru}[1]
{
\ifnum#1<10 \textcircled{\scalebox{0.9}[0.85]{\raisebox{-0.1em}[0.15em][0em]{#1}}}
\else
\textcircled{\scalebox{0.7}[0.67]{\raisebox{0em}[0.15em][0em]{#1}}}
\fi
}

%1桁・2桁とそれ以外の丸数字の定義
\newcommand{\submaru}[1]
{
\ifnum#1<100 \subsubmaru{#1}
\else
\textcircled{\scalebox{0.47}[0.7]{\raisebox{-0.01em}[0.1em][0em]{#1}}}
\fi
}

%1桁・2桁・3桁とそれ以外の丸数字の定義
\newcommand{\maru}[1]
{
\ifnum#1<1000 \submaru{#1}
\else
\textcircled{\scalebox{0.33}[0.74]{\textgt{#1}}}
\fi
}

%document-------------------------------------------------------------------------------------

\begin{document}

\mmaru{3}\mmaru{9}\maru{1}\maru{99}\maru{100}\maru{999}\maru{1000}

\end{document}


急ぎというのもありますが,手元の参考書やwebサイトに複数の条件での場合分けの方法が見当たらなかったため,わざわざ何度も場合わけをするという汚いソースになってしまったことをご容赦ください。
問題の空白についてですが,丸数字の間に不可解なスペースができてしまっていました。しかもこれは丸数字の桁数によって長さが異なっていました(桁数が多いほど空白が小さい)。
なので,これはscaleboxもしくはraiseboxでの設定を変えれば解決するのではと思いました。
ところが,ためしに条件分岐を用いていない\mmaruを作ってみたところ,先に挙げた問題は発生しませんでした。となればifthenに問題があるのではと考えたのですが,ifthenを用いたことによって発生する空白について触れている本や記事は見当たらず,また,桁数によってスペースが変わるというのも単にifthenのせいというのでは説明がつかないのではと思いました。
長い間試行錯誤してみましたのですがどうしても埒が開かず,知人に尋ねてもわからないとのことでしたので,皆様のお力を貸していただければという考えに至りました。
どなたか解決策をご教授いただければ幸いです。
長文失礼しました。
あ い への返信

Re: 「ifthen」と「謎の空白」

- 和田 勇 の投稿
  • newcommand などのコマンド定義で各行に「%」を各行に加えてみてはいかがでしょうか?(全ての \newcommand や \def \gdef に定期ようできるかどうかはそのコマンド次第ですが)

    %1桁とそれ以外の丸数字の定義
    \newcommand{\subsubmaru}[1]%
    {%
    \ifnum#1<10 \textcircled{\scalebox{0.9}[0.85]{\raisebox{-0.1em}[0.15em][0em]{#1}}}%
    \else%
    \textcircled{\scalebox{0.7}[0.67]{\raisebox{0em}[0.15em][0em]{#1}}}%
    \fi%
    }
    
和田 勇 への返信

Re: 「ifthen」と「謎の空白」

- あ い の投稿
和田さま,返信ありがとうございます。
%を各行につけたところ無事解決しました。
よく「無駄な余白が入るので%をつけることがある」というのを聞きますが,いざ直面したときに頭から完全に抜けていました。
ありがとうございました!
和田 勇 への返信

Re: 「ifthen」と「謎の空白」

- 北見 けん の投稿
和田さんの例で、\newcommand の引数指定[1]の後の % と、\else や \fi の後の % は不用かなと思います。

[1]の後の(行末由来の)空白トークンは \newcommand の処理中で引数取得時に捨てられますし、
\else や \fi のようなコントロールシークエンスの名前を確定するための空白文字はトークンになる以前に捨てられます。
北見 けん への返信

Re: 「ifthen」と「謎の空白」

- 和田 勇 の投稿
ご指摘ありがとうございます
和田 勇 への返信

Re: 「ifthen」と「謎の空白」

- 北見 けん の投稿
入力ファイルの行末が空白文字や空白トークンに変換されていく事情については
TeX wiki の
https://texwiki.texjp.org/?TeX%E5%85%A5%E9%96%80%2F%E3%83%9E%E3%82%AF%E3%83%AD%E3%81%AE%E4%BD%9C%E6%88%90
に書いてみようかと思ったのですが、
いざ書こうとするとなかなか難しいですね。