为字符分配特殊语义

为字符分配特殊语义

当寻找吞噬所有后续空行的命令,我想知道是否可以为该命令定义一个由一个字符组成的快捷方式。

是否可以为字符分配执行§某个命令(例如)的特殊语义?\fancystuff

\documentclass{article}
\newcommand\fancystuff{\do\some\fancy\stuff\here}
% How to assign to § the semantics of \fancystuff ?

\begin{document}
    This is text. But the following character §
    gets fancy stuff done.
\end{document}

答案1

当输入编码为Latin-1时,所代表的字节§已经处于活动状态,因此您需要做的就是改变其含义。

% -*- coding: latin-1 -*-
\documentclass{article}
\usepackage[latin1]{inputenc}

\newcommand{\fancystuff}{\textit{Whatever}}
\protected\def§{\fancystuff}

\begin{document}
\section{The fancy § works also in section titles!}

Here's an example of §.

\end{document}

\protected\def是为了确保字符在辅助文件中以其自身形式写入。

如果您使用 UTF-8 作为编码,则可以使用以下命令获得相同的结果newunicodechar

% -*- coding: utf-8 -*-
\documentclass{article}
\usepackage[utf8]{inputenc}
\usepackage{newunicodechar}
\DeclareRobustCommand{\fancystuff}{\textit{Whatever}}
\newunicodechar{§}{\fancystuff}

\begin{document}
\section{The fancy §{} works also in section titles!}

Here's an example of §.

\end{document}

在这种情况\protected\def§不是工作,或者更确切地说,会产生错误的结果。然而角色将不是在辅助文件中将其本身写入。

是否使用\DeclareRobustCommand取决于应该做什么§;如果您不打算在“脆弱”环境中使用它,那么可能\newcommand更好。

答案2

由于 § 不是 ASCII 字符,因此您可以使用 Unicode。

此处 § 在 Unicode 的 Latin-1 补充代码页中具有代码 U+00A7。

\documentclass{article}
\usepackage[utf8]{inputenc}
\DeclareUnicodeCharacter{00A7}{fancystuff}
\begin{document}
    §
\end{document}

这应该打印fancystuff或打印您作为命令的第二个参数提供的任何命令的结果\DeclareUnicodeCharacter

答案3

这在 TeX 世界中被称为“活动字符”。该过程概述如下这篇 TeX FAQ 文章,可以总结如下:

  • 使角色活跃
  • \def做任何你想做的事

以下 MWE 实现了这一点(使用 @ 而不是 § 作为特殊字符,以避免编码问题):

\documentclass{article}
\pagestyle{empty}

\newcommand\fancystuff{\textbf{(pondering over fancy stuff)}}
\catcode`\@=\active
\def@{\fancystuff}

\begin{document}
  This is text. But the following character @
  gets fancy stuff done.
\end{document}

编译结果

相关内容