web-dev-qa-db-ja.com

LaTeX \ newcommandデフォルト引数:空ですか?

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

私は、デフォルト値が\@emptyであり、単純な\ifx\@empty#1条件が適切であることを読みました:

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

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

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

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

36
kolypto

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

\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テストを提供します。

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

48
godbyk

LaTeX3 xparseパッケージの使用:

\usepackage{xparse}
\NewDocumentCommand\optarg{g}{%
  \IfNoValueF{#1}{(((#1)))}%
}
12
Joseph Wright

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

\optarg
\optarg[]
\optarg[test]

あなたはこの表記法でもっと運が良いはずです。

必須の引数に使用するのと同じブラケットをオプションの引数に使用できないのは不愉快ですが、それはそのようです。

8
Norman Ramsey
\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}
3
barraq