梅威瑟:

梅威瑟:

这是一个关于:使用 xifthen 包后,\ifthenelse 丢失全局定义我将参考这个问题给出的答案这里因为它清晰又干净。

梅威瑟:

\documentclass[parskip]{scrartcl}
\usepackage[margin=15mm]{geometry}
\usepackage{xifthen}

\newcommand{\test}[1][]{%
\ifthenelse{\equal{#1}{}}{omitted}{given}%
}

\begin{document}
\par The optional argument was \test[].
\par The optional argument was \test[shubidu].
\end{document}

问题:

如何重写命令定义\test以便:

\test{}

输出:省略

\test{shubidu}

输出:给定

编辑:

感谢大家提供的提示和技巧。有关可能有助于澄清此问题目的的更多信息:我正在尝试使用{}而不是来定义可选参数[],因为我正在进行 TeX -> LyX 传输。[]如果您在下拉菜单上单击“插入”并键入参数,LyX 会插入一个可选参数。否则,{}如果您执行我下面所做的操作,LyX 将插入您的参数。我想保留下面所做的格式,即用以下内容编写:\newcommand{\BriefName}[1]{\xdef\BriefName{#1}}但将参数插入为\BriefName可选。因此,如果 LyX 用户在行中不输入任何内容\BriefName,程序仍会编译,并使用 \BriefName 命令的“空”参数。

在此处输入图片描述

更新的 MWE:

这更符合我的要求。我创建这个是因为这个问答

\documentclass{article}
\usepackage{xifthen}

\newcommand{\BriefName}[1]{ %
        \xdef\BriefName{#1}\ifx\BriefName\empty
          {}%
        \else
          {#1}%
        \fi
}%

\begin{document}
\par This should be empty:\BriefName{}
\par This should also be empty: \BriefName
\par This should say Argument: \BriefName{Argument}
\par This should also say Argument: \BriefName
\end{document}

答案1

你可以用xparse;诀窍是不是重新定义\BriefName你正在尝试做的事情,但是其他保存当前值的控制序列(开始为空)。

\documentclass{article}
\usepackage{xparse}

\ExplSyntaxOn
\NewDocumentCommand{\BriefName}{g}
 {
  \IfNoValueF{#1}
   {
    \tl_gset:Nn \g_jalep_briefname_tl { #1 }
   }
  \tl_use:N \g_jalep_briefname_tl
 }
\tl_new:N \g_jalep_briefname_tl
\ExplSyntaxOff

\begin{document}

This should be empty:\BriefName

This should also be empty: \BriefName[]

This should say Argument: \BriefName{Argument}

This should also say Argument: \BriefName

\end{document}

但是,标准 LaTeX 语法使用[]可选参数,因此最好坚持使用它。

\documentclass{article}
\usepackage{xparse}

\ExplSyntaxOn
\NewDocumentCommand{\BriefName}{o}
 {
  \IfNoValueF{#1}
   {
    \tl_gset:Nn \g_jalep_briefname_tl { #1 }
   }
  \tl_use:N \g_jalep_briefname_tl
 }
\tl_new:N \g_jalep_briefname_tl
\ExplSyntaxOff

\begin{document}

This should be empty:\BriefName

This should also be empty: \BriefName[]

This should say Argument: \BriefName[Argument]

This should also say Argument: \BriefName

\end{document}

在此处输入图片描述

该版本[]还允许使用经典工具来解决。

\documentclass{article}

\newcommand{\BriefName}[1][]{%
  \if\relax\detokenize{#1}\relax
  \else
    \gdef\jalepbriefname{#1}%
  \fi
  \jalepbriefname
}
\def\jalepbriefname{}

\begin{document}

This should be empty:\BriefName

This should also be empty: \BriefName[]

This should say Argument: \BriefName[Argument]

This should also say Argument: \BriefName

\end{document}

答案2

要得到你要求的东西,你只需要[]在声明中删除

\documentclass[parskip]{scrartcl}
\usepackage[margin=15mm]{geometry}
\usepackage{xifthen}

\newcommand{\test}[1]{%
\ifthenelse{\equal{#1}{}}{omitted}{given}%
}

\begin{document}

The optional argument was \test{}.

The optional argument was \test{shubidu}.

\end{document}

然而,原始示例似乎错误使用了可选参数语法。

“未给出”情况的预期语法\test不是\test[]

因此,您不需要测试空参数,LaTeX 已经测试过[是否存在:

\documentclass[parskip]{scrartcl}
\usepackage[margin=15mm]{geometry}
\usepackage{xifthen}

\newcommand{\test}[1][default]{#1\ldots}

\begin{document}

The optional argument was \test.

The optional argument was \test[shubidu].

\end{document}

相关内容