42

引数なしでは何も出力しない単純なコマンド例を作成しようとしていますが、引数があるとそれを何かで囲みます。

\@emptyデフォルト値は次のようにする必要があり、単純な\ifx\@empty#1条件で機能する必要があることを読みました。

\newcommand{\optarg}[1][\@empty]{%
\ifx\@empty#1  {}  \else  {(((#1)))}  \fi
}

\optarg % (((empty)))
\optarg{} % (((empty)))
\optarg{test} % (((empty))) test

後の 3 つのコマンドはすべてempty何らかの理由で単語を出力します。最初の 2 つのコマンドでは何も出力せず、最後のコマンドでは(((test))).

TeXLive/Ubuntu を使用しています。アイデア?

4

4 に答える 4

60

次のテストを試してください。

\documentclass{article}

\usepackage{xifthen}% provides \isempty test

\newcommand{\optarg}[1][]{%
  \ifthenelse{\isempty{#1}}%
    {}% if #1 is empty
    {(((#1)))}% if #1 is not empty
}

\begin{document}

Testing \verb|\optarg|: \optarg% prints nothing

Testing \verb|\optarg[]|: \optarg[]% prints nothing

Testing \verb|\optarg[test]|: \optarg[test]% prints (((test)))

\end{document}

xifthenパッケージは、\ifthenelse構造と\isemptyテストを提供します。

もう 1 つのオプションは、ifmtargパッケージを使用することです (ドキュメントについては、ifmtarg.styファイルを参照してください)。

于 2010-01-27T08:06:45.083 に答える
12

LaTeX3 xparse パッケージの使用:

\usepackage{xparse}
\NewDocumentCommand\optarg{g}{%
  \IfNoValueF{#1}{(((#1)))}%
}
于 2010-01-27T08:23:47.320 に答える
9

LaTeX が書かれている基礎となる TeX エンジンでは、コマンドが取ることができる引数の数は固定されています。デフォルトで行ったこと[\@empty]は、LaTeX に次のトークンを調べて、それが開き角括弧であるかどうかを確認することです[。その場合、LaTeX は角括弧の内容を引数として受け取ります。そうでない場合、次のトークンが入力ストリームに戻され、\@empty代わりにデフォルトの引数が使用されます。したがって、アイデアを機能させるには、括弧を使用して、存在する場合にオプションの引数を区切る必要があります。

\optarg
\optarg[]
\optarg[test]

この表記法で運が良くなるはずです。

必須の引数に使用するのと同じブラケットをオプションの引数に使用できないのは面倒ですが、それがその方法です。

于 2010-01-27T02:26:51.427 に答える
3
\documentclass{article}

\usepackage{ifthen} % provides \ifthenelse test  
\usepackage{xifthen} % provides \isempty test

\newcommand{\inlinenote}[2][]{%
    {\bfseries{Note:}}%  
    \ifthenelse{\isempty{#1}}  
            {#2}               % if no title option given
            {~\emph{#1} #2}    % if title given
}

\begin{document}

\inlinenote{
    simple note
}

\inlinenote[the title]{
    simple note with title
}

\end{document}
于 2011-07-13T10:25:56.607 に答える