下列的威尔·罗伯逊承认那Fwiw,我不知道有丢失的问题 \makeatother
,但你是对的。我的坏习惯就是不说这句话,而当我意识到我从来没觉得这件事有多重要之后,我对同一件事也逐渐变得懈怠,我想知道纪律到底有多重要\makeatother
?
对于经验丰富的用户来说,我能想到的最坏后果\makeatother
是,由于疏忽使用 结束,可能会导致疏忽\ExplSyntaxOff
使用expl3
,这远非毫无问题。但这不是任何人都会习惯犯的错误。
令人担心的是,不遵守纪律意味着有些人可能会不清楚“包/Knuth 命名空间”和“用户命名空间”之间的区别。
但我不能说这两种考虑都很紧急。它似乎并不像消除界面中可避免的状态这样的编程原则那么重要。还有什么更引人注目的吗?
答案1
@
理论上,在用户文档或某个辅助文件中的宏后面可能有一个直接的宏。如果没有\makeatother
这个宏,就会造成麻烦。
第二个麻烦的来源是特殊的包,它们读取用户输入并使用\let
/\futurelet
和进行比较\ifx
。我不确定包如何解析列定义中的array
势,但例如我的包允许序列,我很明智地用 catcode测试了@
tabular
tikz-timing
@{<code>}
@
信和其他。如果我没有想到丢失\makeatother
会破坏某些用户代码而不知道为什么。
一般来说,关闭您自己明确打开的所有内容是一种很好的编程习惯。这可以是\makeatletter
/\makeatother
或\openout
/\closeout
或任何类似的内容。当使用组本地化更改时,这不适用。
答案2
松懈的纪律的一个问题是,它与在非句末句号后重置空间因素\makeatother
的使用相冲突。\@
\documentclass{article}
\begin{document}
Articles from the Proc. Amer. Math. Soc.
Articles from the Proc.\@ Amer.\@ Math.\@ Soc.
\makeatletter
Articles from the Proc.\@ Amer.\@ Math.\@ Soc.
\end{document}