21

私は自分のコマンドと環境を試していますが、今はこれらの問題に直面しています。

  1. と呼ばれるコマンド\foo{parameter}[optional]または環境を作成する方法は\begin{bar}{parameter}[optional]
  2. コマンドの作成方法\foo[optional_1]...[optional_n]{parameter}

私はもう試した

\newcommand{\foo}[3][][]{#1#2#3}    - failed
\newcommand{\foo}[3][2][][]{#1#2#3} - failed

誰かがヒントを知っていますか?どうもありがとう。

4

4 に答える 4

18
  1. \foo{parameter}[optional]コマンドを単純に作成することはできません。ただし、\foo[optional]{parameter}コマンドを作成することはできます

    \newcommand{\foo}[2][def]{Mandatory: #2; optional: #1}
    

    として呼び出すと\foo{given}、生成されMandatory: given, optional: defます。として呼び出すと\foo[optional]{given}、 が生成されMandatory: given, optional: optionalます。これはおそらくあなたが行うべき方法です.LaTeXコードの残りの部分で見栄えが良くなります. オプションのパラメーターを使用して新しい環境を作成するには、

    \newenvironment{env}[2][def]{(#1,#2)\begingroup}{\endgroup}
    

    ここ#でもオプションの引数です。これも と書きます\begin{env}[opt]{req}...\end{env}。他の形式のコマンドが本当に必要な場合は、私の回答の最後を参照してください。

  2. TeX FAQ には、複数のオプションの引数を持つコマンドの記述に関する回答があります。その方法には 2 つのオプションがあります。根底にある考え方は、オプションの引数を取るコマンドを定義してから、それ自体がオプションの引数を取る別のコマンドを実行する、などです。twooptパッケージはこれをカプセル化します。


のようなコマンドが本当に必要な場合は、そのよう\reversed{mandatory}[optional]にすることができます。まず、必要な引数を取るコマンドを定義し、それをマクロに格納してから、別のコマンドに転送します。この 2 番目のコマンドはオプションの引数を取り、定義済みのコマンドとオプションの引数を使用します。これをすべてまとめると、

\makeatletter
\newcommand{\reversed}[1]{\def\reversed@required{#1}\reversed@opt}
\newcommand{\reversed@opt}[1][def]{Required: \reversed@required; optional: #1}
\makeatother

\reversed{mandatory}[optional]その後、 or だけを使用する\reversed{mandatory}と、すべてが機能するはずです。

于 2010-05-26T00:53:01.643 に答える
15

xparseパッケージの使用(LaTeX3開発作業の一部):

\usepackage{xparse}
\NewDocumentCommand\foo{O{}O{}m}{%
  % Code with optional #1 and #2 with empty defaults
}
\NewDocumentCommand\foo{mO{}}{%
  % Code with optional #2 with empty default
}
\NewDocumentEnvironment{foo}{O{}}{%
% Start code with optional #1
}{%
%  End code with optional #1
}

オプションの引数は、xparseと\newcommandでは少し異なります。与えられているかどうかを検出できます。

\NewDocumentCommand\foo{mo}{%
  \IfNoValueTF{#2}
   {Code without #2}
   {Code with #2}%
}

これは小文字の「o」を使用して機能するのに対し、大文字の「O」にはデフォルト値が必要であることがわかります(空のグループを含めることで空にしました)。

于 2010-05-27T06:02:47.540 に答える
6

xargs パッケージも検討してください。以下は、そのドキュメントの例です。

いつも通りにセットして、

\usepackage{xargs}

そして、あなたが定義した場合

\newcommandx*\coord[3][1=1, 3=n]{(#2_{#1},\ldots,#2_{#3})}

(これは、指定されていない場合は最初の引数に "1" を使用し、3 番目の引数に "n" を使用することを意味します)。それで

$\coord{x}$

利回り (添字なし)

(x1, . . , xn)

$\coord[0]{y}$

yields (ここでも添え字がなく、y が必須パラメーターを置き換えます)

(y0, ..., yn)

于 2010-07-21T12:24:33.900 に答える