web-dev-qa-db-ja.com

LaTeXオプション引数

LaTeXでオプションの引数を使用してコマンドを作成するにはどうすればよいですか?何かのようなもの:

\newcommand{\sec}[2][]{
    \section*{#1
        \ifsecondargument
            and #2
        \fi}
    }
}

その後、私はそれを次のように呼び出すことができます

\sec{Hello}
%Output: Hello
\sec{Hello}{Hi}
%Output: Hello and Hi
116
Verhogen

guide の例:

\newcommand{\example}[2][YYY]{Mandatory arg: #2;
                                 Optional arg: #1.}

This defines \example to be a command with two arguments, 
referred to as #1 and #2 in the {<definition>}--nothing new so far. 
But by adding a second optional argument to this \newcommand 
(the [YYY]) the first argument (#1) of the newly defined 
command \example is made optional with its default value being YYY.

Thus the usage of \example is either:

   \example{BBB}
which prints:
Mandatory arg: BBB; Optional arg: YYY.
or:
   \example[XXX]{AAA}
which prints:
Mandatory arg: AAA; Optional arg: XXX.
155
miku

「オプションの引数」を作成する背後にある一般的な考え方は、まずトークンストリームで次に出現する文字を検出するために前方にスキャンする中間コマンドを定義し、次に適切なマクロを挿入して適切な引数を処理することです。これは、一般的なTeXプログラミングを使用すると非常に面倒です(難しくはありませんが)。 LaTeXの\@ifnextcharはそのようなことには非常に便利です。

質問に対する最善の答えは、新しいxparseパッケージを使用することです。 LaTeX3プログラミングスイートの一部であり、非常に任意のオプション引数を使用してコマンドを定義するための広範な機能が含まれています。

この例では、1つまたは2つの中括弧引数を取る\secマクロがあります。これは、次のxparseを使用して実装されます。

\documentclass {article} 
\usepackage {xparse} 
\begin {document} 
\DeclareDocumentCommand\sec {mg} {%
 { #1%
\IfNoValueF {#2} {および#2}%
}%
} 
(\ sec {Hello})
 (\ sec {Hello} {Hi})
\end {document} 

引数{ m g }は、\secの引数を定義します。 mは「必須引数」を意味し、gは「オプションのブレース引数」を意味します。 \IfNoValue(T)(F)を使用して、2番目の引数が実際に存在したかどうかを確認できます。許可されている他のタイプのオプション引数については、ドキュメントを参照してください。

24
Will Robertson

上記のすべては、LaTeXでニースで柔軟な(またはオーバーロードを禁止する)関数を作成することが難しいことを示しています!!! (TeXコードはギリシャ語のように見えます)

さて、最近の(それほど柔軟ではないにせよ)開発を追加するために、ここで私が最近論文で使用したものを、

\usepackage{ifthen}  % provides conditonals...

「オプション」コマンドをデフォルトで空白に設定して、コマンドを開始します。

\newcommand {\figHoriz} [4] []  {

次に、オプションの引数が空白かどうかに応じて、マクロに一時変数\ temp {}を設定します。これは、渡された引数に拡張できます。

\ifthenelse { \equal {#1} {} }  %if short caption not specified, use long caption (no slant)
    { \def\temp {\caption[#4]{\textsl{#4}}} }   % if #1 == blank
    { \def\temp {\caption[#1]{\textsl{#4}}} }   % else (not blank)

次に、2つの場合に\ temp {}変数を使用してマクロを実行します。 (ここでは、ユーザーによって指定されていない場合は、短いキャプションを長いキャプションに等しく設定します)。

\begin{figure}[!]
    \begin{center}
        \includegraphics[width=350 pt]{#3}
        \temp   %see above for caption etc.
        \label{#2}
    \end{center}
\end{figure}
}

この場合、\ newcommand {}が提供する単一の「オプション」引数のみをチェックします。たとえば、3つの「オプションの」引数に対して設定する場合、3つの空の引数を送信する必要があります。

\MyCommand {first arg} {} {} {}

これはかなりばかげていますが、それはLaTeXを使用する限りです-TeXコードを見始めたら、それほどセンシティブではありません... Robertson氏のxparseメソッドが好きですそれを試してみてください...

22
Demis

必要なものは次のとおりです。

\makeatletter
\def\sec#1{\def\tempa{#1}\futurelet\next\sec@i}% Save first argument
\def\sec@i{\ifx\next\bgroup\expandafter\sec@ii\else\expandafter\sec@end\fi}%Check brace
\def\sec@ii#1{\section*{\tempa\ and #1}}%Two args
\def\sec@end{\section*{\tempa}}%Single args
\makeatother

\sec{Hello}
%Output: Hello
\sec{Hello}{Hi}
%Output: Hello and Hi
13
Alexey Malistov

\dxを短縮するコマンド\;\mathrm{d}x(つまり、積分の微分の前に余分なスペースを置き、「d」も直立させる)を作成したいときに、同様の問題がありました。しかし、その後、オプションの引数として統合の変数を含めるのに十分な柔軟性を持たせたかった。前文に次のコードを入れました。

\usepackage{ifthen}

\newcommand{\dx}[1][]{%
   \ifthenelse{ \equal{#1}{} }
      {\ensuremath{\;\mathrm{d}x}}
      {\ensuremath{\;\mathrm{d}#1}}
}

それから

\begin{document}
   $$\int x\dx$$
   $$\int t\dx[t]$$
\end{document}

オプションの引数付きの\ dx を与える

4
csar