这是一个关于:使用 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}