我有一个非常基本的问题\renewcommand
。
如何危险的是不是要用这个命令?
也就是说,使用这样的命令对文件编译的稳定性有影响吗?
非常感谢您的反馈。
附言:我不确定我是否解释清楚了。
答案1
除了搞笑之外
\renewcommand{\fi}{Firenze} % a handy abbreviation
这将产生令人惊讶的错误消息
! LaTeX Error: Missing \begin{document}.
See the LaTeX manual or LaTeX Companion for explanation.
Type H <return> for immediate help.
...
l.8 \begin{document}
或者类似
\renewcommand{\box}[1]{\colorbox{red}{#1}}
这使得 TeX 遭受痛苦,直到放弃使用
! TeX capacity exceeded, sorry [grouping levels=255].
\rlap #1->\hb@xt@ \z@
{#1\hss }
还有许多其他命令在任何情况下都不应重新定义。请注意\fi
和\box
是 TeX 原语,因此如果更改其含义,可能会出现问题。不过,还有“方便”的缩写,例如
\renewcommand{\a}{\alpha}
\renewcommand{\b}{\beta}
\renewcommand{\c}{\gamma}
我的一位同事很喜欢的 可能会产生神秘的效果。他在一封慌乱的电子邮件中向我求助,因为他与一位土耳其合著者的论文拒绝排版。猜猜怎么着?这位合著者的姓氏以“Ş”开头,这是土耳其语中很常见的字母。排版“Ş”依赖于\c
即使使用直接 UTF-8 输入也不会改变。顺便说一句,也不\a
应该\b
重新定义和。
但在某些情况下\renewcommand
是强制性的:如果你想改变表格或数组中的行间跳过,你确实应该使用
\renewcommand{\arraystretch}{<new factor>}
(默认定义赋值1
)。
有些情况下\renewcommand
是安全的,我通常会提到
\renewcommand{\phi}{\varphi}
\renewcommand{\epsilon}{\varepsilon}
以确保使用欧洲大陆更常见的字体。
在其他情况下,人们必须像玻璃器皿店里的大象一样小心谨慎:非常小心。
答案2
这取决于你使用什么\renewcommand
!一般来说,LaTeX 不提供任何“安全性”;如果你重新定义 LaTeX 所依赖的宏或原语,最终结果可能会出现明显的错误或(可能更糟)无声问题。
话虽如此,在很多情况下,预期的它可以用来\renewcommand
改变行为,所以我不会说人们应该避免使用它。
答案3
A愚蠢的\renewcommand
示例文档如果不检查前面的代码就使用会发生什么:
通常\addcontentsline
有 3 个参数,因此\addcontentsline{toc}{section}{Some text}
将保留Some text
在目录中,格式化为节条目。
但是,\renewcommand{\addcontentsline}{Oh my!}
删除宏的所有三个参数,将其内容保留在输入流中。
\documentclass{article}
\begin{document}
\tableofcontents
\section{Foo}
\renewcommand{\addcontentsline}{Oh my!}
\section{Foobar}
\end{document}
因此,最后还是建议在尝试之前先查找宏的定义\renewcommand
。
这可以通过查看类或包代码(或在latex.ltx
)来完成,阅读文档或说
\meaning\foo
在文件正文中\show\foo
(也可以在序言中完成
答案4
您始终可以使用\show
查看命令的现有定义(如果已定义)。这可以在序言或文档正文中完成。结果将显示在您的控制台(或终端)中,然后程序将停止。
例如,使用LuaLaTeX(采用utf-8编码,\show\a
回复说它是一个宏,定义为:
\expandafter \@changed@cmd \csname \string #1\endcsname \relax
所以我看着它,问自己,这是我想要重新定义的东西吗?可能不是!它看起来很重要,但我不太确定它的作用。
另一方面,\show\i
收益为:
TU-cmd \i \TU\i
我碰巧明白这意味着什么,而且我自己的工作中不太可能需要它。因此,我可以考虑更新该命令,因为它将\i
成为我自己代码中的一个方便的宏。