答案1
事实上,这在 TeX/LaTeX 中非常常用。例如shorvrb
, ,fancyvrb
软件包listings
用于简短|
的逐字文本。Knuth 本人也在|
电子书,并使用"
和|
作为索引项和标签具体数学。当然你可以定义自己的短命令。
首先你要记住它们的缺点。在 (La)TeX 中,只有极少数字符很少用于普通文本排版,而后可用于短命令。最常见的两个命令是|
和"
。它们在普通文本中都没有用处,|
可以在数学模式中使用\vert
。要注意|
用于tabular
垂直线的列说明符,而"
表示 TeX 中的十六进制数。并且babel
还重新定义了 在某些语言中的含义"
。此外,在verbatim
和 中\verb
,更改的字符也可能有问题。就这些吗?不!|
的参数中的字符也有特殊含义\index
。我不确定这些都是情况,你可能会遇到更多。
此外,您还应该能够通过恢复 catcodes 来禁用短命令。例如,shortvrb
提供\DeleteShortVerb
,您可以轻松禁用短逐字命令。
第三点就是要注意不同包和你自己的代码之间的冲突。既然你可以用 来shortvrb
改变 的含义|
,那么就不能同时使用|
for 。如果代码写得不仔细,可能会出现更多的问题。\emph
您可以阅读文档化的源代码,shortvrb
了解如何安全地定义这样一个简短的命令,并思考您可能遇到的问题。
有些问题可以通过仔细编码来避免。例如,直接定义一个短命令,像这样:
\documentclass{article}
\begin{document}
\catcode`|=\active
\def|#1|{\emph{#1}}
\begin{verbatim}
a|b|c|d
\end{verbatim}
\end{document}
你会得到一个! File ended while scanning use of |.
错误。如何解决?shortvrb
包使用\add@special
将字符添加到\dospecials
列表中,然后verbatim
就可以正常工作了:
\def\add@special#1{%
\rem@special{#1}%
\expandafter\gdef\expandafter\dospecials\expandafter
{\dospecials \do #1}%
\expandafter\gdef\expandafter\@sanitize\expandafter
{\@sanitize \@makeother #1}}
\def\rem@special#1{%
\def\do##1{%
\ifnum`#1=`##1 \else \noexpand\do\noexpand##1\fi}%
\xdef\dospecials{\dospecials}%
\begingroup
\def\@makeother##1{%
\ifnum`#1=`##1 \else \noexpand\@makeother\noexpand##1\fi}%
\xdef\@sanitize{\@sanitize}%
\endgroup}
确实相当复杂。您可以在需要时使用它来编写自己的代码。如果您只重新定义一个特定字符(如或 )\add@special
,代码会更简单。Herbert展示了另一个示例,以确保它在环境中运行良好,并且不要忘记修补环境!|
"
|
tabular
array
如果遇到奇怪的情况,可以使用类似 的命令\DeleteShortVerb
。最简单的实现就是将 catcode 改回 12。但是定义一个 safe\DeleteShortVerb
来恢复字符的原有含义也比较困难。
为了防止其他软件包中可能出现的问题,您应该尽可能晚地更改 catcode。您可以使用 来\AtBeginDocument
确保 catcode 在前言之后更改。
答案2
这是一个个人判断的问题,两者之间哪个更可读
some text with a \emph{word} emphasized
some text with a |word| emphasized
我仍然认为前者是更多的可读(但我使用 Emacs 对 的参数进行着色和倾斜\emph
)。
如果你打算使用这样的快捷方式,你必须注意 的通常含义|
。你可以使用\vert
或amsmath
的\lvert
和\rvert
代替|
来表示绝对值,但 仍然存在问题tabular
。
一个可能仍不完全的解决方案可能是
\usepackage{array}
\catcode`|=\active
\protected\def|{\ifmmode\vert\else\expandafter\textvert\fi}
\def\textvert#1|{\emph{#1}}
这样,诸如$|x|$
或 之类的输入也$\left|\frac{1}{2}\right|$
将起作用。
注1.|
在表格序言中使用是安全的,只要加载array
包即可。另一方面,表格环境中的垂直规则应该绝不(嗯,几乎从来没有)被使用。
笔记2。使用此设置,|
将无法在逐字模式下工作。
答案3
它可能总是如果您更改字符的默认 catcode,则会出现问题。是否必须重置某些宏/环境的 catcode 或使用其他宏取决于您使用的软件包:
\documentclass{article}
\catcode`\|=13
\def|#1|{\emph{#1}}
\let\Tabular\tabular
\let\endTabular\endtabular
\def\tabular{\begingroup\catcode`\|=12\Tabular}
\def\endtabular{\endTabular\endgroup}
\begin{document}
This is an \emph{important} test.
This is an |important| test.
\begin{tabular}[b]{|c|}
foo
\end{tabular}
This is an |important| test.
$y=\vert x\vert$
\end{document}
对于这样的快捷方式,应该使用不常用的字符。|
不是一个好的选择,/
也许更好。
答案4
我发现的最大问题是其他软件包可能会做类似的事情。如果我没记错的话,例如,在 中.dtx
|
被定义为shortvrb
。其他软件包也可能这样做,重新定义|
可能会导致问题。如果某个软件包使用 作为分隔符而不是宏,就会出现最大的问题|
。这只会产生错误。
一个较小的问题是您不再有直接的方法来写绝对值(尽管您可以|
在数学模式中更改类别代码)。
不过,只要您小心使用其他包,我认为这种方法不会有什么实际问题。
编辑:正如 Leo 在评论中所说,这在表格中使用垂直线时会导致问题。我通常建议不要在表格中使用垂直线,但这是一个很好的观点。基本上,任何你使用 a|
作为普通字符的地方都不能再使用了,因为它现在是活动的。您可以选择一些您几乎不使用的字符来尽量减少问题,或者您可以|
在(例如)表格中使用它时暂时将其用作字母。