引数付きで@ifstarを使用する方法

引数付きで@ifstarを使用する方法

非スター バージョンでは変数に値を保存し、スター バージョンでは変数から値を読み取るコマンドを定義するために使用したいと思います@ifstar。次のことを試しました。エラーは生成されませんが、値も印刷されません。

\def\sndname#1{\@ifstar\@sndname{\def\@sndname{#1}}}
\sndname{Hello U2}
\sndname*

このパターンを使用できることはわかっていますが、ワンライナーとして実行する方法はありますか?

\def\foo{\@ifstar\@foo\@@foo}
\def\@foo#1{...}
\def\@@foo#1{...}

答え1

\documentclass{article}
\makeatletter
\def\sndname{\@ifstar\@sndname{\def\@sndname}}
\makeatother
\begin{document}
Set it \sndname{Hello U2}and use it \sndname*.
\end{document}

コツは、\sndname引数ではなく\def内部を読み取ることです\sndname

答え2

あなたは LaTeX 構文ガイドラインを乱用しています。コマンドの * バージョンには、通常、標準バージョンと同じ必須引数が必要です。

代わりにオプションの引数を使用することもできます。

\documentclass{article}
\usepackage{xparse}

\ExplSyntaxOn
\NewDocumentCommand{\sndname}{o}
 {
  \IfNoValueTF{#1}
    {\tl_use:N \l_cocomore_sndname_tl}
    {\tl_set:Nn \l_cocomore_sndname_tl { #1 }}
 }
\tl_new:N \l_cocomore_sndname_tl
\ExplSyntaxOff

\begin{document}

\sndname[Hello U2]
\sndname

\end{document}

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

ただし、変数を設定する場合と使用する場合で異なるコマンドを使用する方がよい方法です。

答え3

@egreg の回答への追加です。こちらの方が構文が優れていることに同意しますが、 はありませんxparse。コメント付きバージョンはコマンドの TeX スタイルの定義で、コメントなしバージョンは LaTeX スタイルの定義です。LaTeX 定義では、オプションの引数はデフォルト値のみを取ることができ、ここでは に設定されています\empty。これはコードで確認できます。 でロードされない限り、動作するはずです\empty。コマンドを囲むドットは、余分なスペースが追加されていないことを確認するためだけのものです。(実際、LaTeX バージョンはおそらくワンライナーとして見ることができますが、次のようにすると読みやすくなります:-)

\documentclass{article}
%%%% TeX style definition
% \makeatletter
% \def\sndname{\@ifnextchar[\opt@sndname\@sndnamevar}
% \def\opt@sndname[#1]{\def\@sndnamevar{#1}}
% \makeatother

%%%% LaTeX style definition
\newcommand\sndname[1][\empty]{%
  \ifx#1\empty
    \sndnamevar
  \else
    \def\sndnamevar{#1}%
  \fi}

%%%% Load with nothing (just in case \sndname is used before loaded)
\sndname[]
%%%%
\begin{document}
Load: .\sndname[Name of snd].

Print: .\sndname.

\end{document}

関連情報