\emph 的简写版本和非标准代码

\emph 的简写版本和非标准代码

关于简短版本\emph为我提供了全新的选择,我应该添加令人印象深刻的选择。然而,建议的方法那里一方面,结果使用非标准代码,但另一方面,可读性更强。我有两个后续问题:

  1. 在做这样的事时,应该牢记最危险的事情是什么?
  2. 更一般地说,这样的代码片段的优缺点是什么?

答案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展示了另一个示例,以确保它在环境中运行良好,并且不要忘记修补环境!|"|tabulararray

如果遇到奇怪的情况,可以使用类似 的命令\DeleteShortVerb。最简单的实现就是将 catcode 改回 12。但是定义一个 safe\DeleteShortVerb来恢复字符的原有含义也比较困难。

为了防止其他软件包中可能出现的问题,您应该尽可能晚地更改 catcode。您可以使用 来\AtBeginDocument确保 catcode 在前言之后更改。

答案2

这是一个个人判断的问题,两者之间哪个更可读

some text with a \emph{word} emphasized
some text with a |word| emphasized

我仍然认为前者是更多的可读(但我使用 Emacs 对 的参数进行着色和倾斜\emph)。

如果你打算使用这样的快捷方式,你必须注意 的通常含义|。你可以使用\vertamsmath\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|作为普通字符的地方都不能再使用了,因为它现在是活动的。您可以选择一些您几乎不使用的字符来尽量减少问题,或者您可以|在(例如)表格中使用它时暂时将其用作字母。

相关内容