内部パラメータに応じて出力が変わる新しいコマンドを定義する

内部パラメータに応じて出力が変わる新しいコマンドを定義する

\LaTeX で、1 つの必須値と別のオプション値 (パラメーター) を入力として受け取ることができる新しいコマンドを定義する方法を誰か教えていただけないでしょうか。この場合、オプション引数の値に応じて、出力オブジェクトのタイプが変わるはずです。

具体的には、私の場合、括弧を描画するコマンドを指定する必要があります\dependSet(<arg>, <opt par>)。この場合、オプション引数の有無に応じて出力(内部の縦線の有無)を変更する必要があります。

関数 出力
\dependSet{x, y} ここに画像の説明を入力してください
\dependSet{x, y}{a} 行

したがって、使いやすさのためには、パラメータがコマンドの引数の後に置かれ、角括弧ではなく中括弧で選択されることが重要です。

追伸:実際のところ、LaTex がかなり使いにくい表記法 (ALGOL 60 のようなものを彷彿とさせる) を使用しており、Python のようなスタイルで新しいコマンドを定義できるように何もしていないのは残念です。

答え1

何らかの理由で入力したくない(x,y)と仮定しましょう(x,y\mid a)。入力しないのには十分な理由があります。たとえば、表記法を変更したい場合や変更する必要がある場合などです。ハードワイヤード入力では、このタスクが非常に困難になります。

アイデアは次のように入力することです

\dependSet{x,y}
\dependSet{x,y|a}

ただし、最終的な出力には影響しません。入力は非常に自然で、括弧が多すぎることによる複雑さを回避します。

どうすればいいでしょうか?\NewDocumentCommandその\SplitArgument機能を使うことができます。

\documentclass{article}
%\usepackage{xparse} % uncomment for older versions of LaTeX

\NewDocumentCommand{\dependSet}{>{\SplitArgument{1}{|}}m}{%
  \dependSetAux#1%
}
\NewDocumentCommand{\dependSetAux}{mm}{%
  \IfNoValueTF{#2}{% no | found
    (#1)%
  }{% found |
    (#1\mid #2)%
  }%
}

\begin{document}

$\dependSet{x}+\dependSet{x,y}+\dependSet{x,y|a}$

\end{document}

ここに画像の説明を入力してください

コメント。

このコマンドは\dependSet、引数を 2 つの中括弧グループとして渡します。最初の引数に\dependSetAuxがない場合、2 番目の中括弧グループは、示されているようにテストできる になります。|{-NoValue-}

最終的な書式を変更する場合は、 を実行します\dependSetAux

おそらくもっと効率的なコードだが、あまり単純ではない。

\NewDocumentCommand{\dependSetAux}{mm}{%
  (#1\IfValueT{#2}{\mid #2})%
}

答え2

次のコードは、完全な例で示されるように、仕様と完全に互換性があります。

\documentclass[onecolumn]{article}

\newcommand\ds[1]{%
    (#1)%
}

\begin{document}
    This can be used as text:
    
    \ds{x, y}
    
    \ds{x, y|a}
    
    It can also be used inline in math-mode: $\ds{x, y}$, see also: $\ds{x, y|a}$.
\end{document}

ご覧のとおり、アイデアは引数と機能を分離することです。これは、使用するか使用しないかのあらゆる種類の組み合わせを考えるよりも簡単です。

ここに画像の説明を入力してください

関連情報