![通过命令行指定的 \def 值未被正确识别](https://linux22.com/image/300529/%E9%80%9A%E8%BF%87%E5%91%BD%E4%BB%A4%E8%A1%8C%E6%8C%87%E5%AE%9A%E7%9A%84%20%5Cdef%20%E5%80%BC%E6%9C%AA%E8%A2%AB%E6%AD%A3%E7%A1%AE%E8%AF%86%E5%88%AB.png)
我很难理解为什么在命令行上定义宏与在文件中指定的宏的处理方式不同。
下面的 MWE 允许\FormattingMode
设置为Print
或Electronic
。如果设置为任何触发其他值 a \PackageError
。当文件中指定了该选项时,此方法可以正常工作。因此,以下命令可以正常工作:
pdflatex "\input{TeX-SE}"
\FormattingMode
但是,当我尝试通过命令行定义时:
pdflatex "\def\FormattingMode{Print}\input{TeX-SE}"
我最终
*****
***** 未知\FormattingMode
="打印"。
***** 有效\FormattingMode
: "电子" 或 "打印"。
*****
! 包裹错误: 无效\FormattingMode
="打印"。
代码:
%\providecommand{\FormattingMode}{Electronic}%
\providecommand{\FormattingMode}{Print}%
\documentclass{article}
%% ----------------------------------------------- start .sty file contents
%% The following is buried in a .sty file, but is added here to simplify the MWE
\newcommand{\FormattingModeElectronic}{Electronic}%
\newcommand{\FormattingModePrint}{Print}%
\AtBeginDocument{% Ensure that a proper mode was provided.
\ifx\FormattingMode\FormattingModeElectronic
\typeout{***** Formatting for ELECTRONIC medium}%
\else
\ifx\FormattingMode\FormattingModePrint
\typeout{***** Formatting for PRINT medium}%
\else
\typeout{*****}%
\typeout{***** Unknown \string\FormattingMode="\FormattingMode".}%
\typeout{***** Valid \string\FormattingMode: "\FormattingModeElectronic" or "\FormattingModePrint".}%
\typeout{*****}%
\PackageError{}{Invalid \string\FormattingMode="\FormattingMode".}{}%
\fi
\fi
}%
%% ----------------------------------------------- end .sty file contents
\begin{document}
some content formatted for \textbf{\FormattingMode} media
\end{document}
答案1
当你这样做时\newcommand{\foo}{bar}
,命令\show\foo
会告诉你
> \foo=\long macro:
->bar.
当你说\def{\FOO}{bar}
你得到
> \FOO=macro:
->bar.
然后\ifx\foo\FOO
会计算为假,因为一个宏很长,而另一个宏不长。
如果您计划\def
在命令行中使用,请使用\newcommand*
不生成\long
宏的命令。
摘自 TeXbook 第 210 页:
•
\ifx
〈token 1〉〈token 2〉(测试 token 是否一致)
在这种情况下,TeX 会不是当看到两个标记时,会展开控制序列。如果 (a) 两个标记不是宏,并且它们都表示相同的(字符代码、类别代码)对或相同的 TeX 基元或相同的\font
或\chardef
或\countdef
等,则条件为真;或者如果 (b) 两个标记是宏,并且它们相对于\long
和具有相同的状态\outer
,并且它们都具有相同的参数和“顶级”扩展。例如,在 之后\def\a{\c}| |\def\b{\d}| |\def\c{\e}| |\def\d{\e}| |\def\e{A}|
,\ifx
测试将发现\c
和\d
相等,但不会发现和\a
、\b
和\d
,也不会发现的\e
任何其他组合。\a
\b
\c
\d
\e