单字符宏

单字符宏

我想定义一个长度最多为一个标记的宏。

\w是宏,并且 w 之后的任何内容都不被视为宏名称的一部分。\wTest与 相同\w Test。我不关心是否没有其他以 开头的宏很乱(至少在我的文档中是这样的,因为我没有使用任何软件包)。显然它不应该干扰其他软件包。

或者,如果无法做到这一点,我希望能够重新定义一些特殊字符,如^|来完成这项工作。我可能会想在不使用 的情况下使用它。

假设我想|输入一些内容

\documentclass{article}

\def\|{hello\,}

\begin{document}
\|world

\end{document}

但我宁愿做 |world。(我的文档非常简单,只有两个或三个特殊的宏,因此将这些标记简化为最简单的表示形式更加合乎逻辑。例如,我永远不会以任何正常方式在我的文档中使用|^,因此我可以使用它们来表示一些标记。我只需要处理 tex 如何解释它们)在我自己的文档中没有风险,因为它要么是平面文本,要么是很少的 tex/latex 宏(我使用 \vspace 和 \hspace 以及一些简单的环境,如居中以及我自己的 3 个宏来标记纯文本)。

例如,

我可能有

This is a |test paragraph^. 
\begin{center} and this^ is |centered \end{center}

其中 | 和 ^ 可能是相当复杂(长)的标记,会使原始段落变得混乱。事实上,甚至摆脱环境也会很好:

This is a |test paragraph^.
<and this^ is |centered>

(请注意,第二个比第一个更易读)

答案1

我认为您的第一个建议(一个宏,\w\wTest处理方式与 相同\w Test)需要进行大量修改。对于第二个建议,您只需将相关字符的 catcode 设置为 即可\active

\documentclass{article}
\catcode`|=\active
\def|{abc}
\begin{document}
|
\end{document}

答案2

你应该放弃你的想法,一个单一的符号命令\w:你必须改变\catcode的w,这不仅会影响命令,开始使用 w 但所有名称中都带有 w 的命令都可能产生相当令人惊讶的副作用,即使您的文档本身不包含任何 w:

\documentclass{article}
\begin{document}
\catcode`\w=12
\tableofcontents
\section{abc}
\end{document}

您的其他想法也是如此:仅仅确保您永远不会输入特定符号是不够的。您还必须确保没有外部文件(如 toc、aux、lof、bbl 等)使用它。

答案3

如果您使用的是 LuaTeX,则可以在排版引擎看到文本文件之前对其进行拦截。例如,在 ConTeXt 中,您可以使用以下命令:

\usemodule[translate]

\def\wTest{default}

\translateinput[\string\w][Something else ]

\starttext
\wTest

\enableinputtranslation
\wTest \crlf
\wAgain
\disableinputtranslation

\wTest
\stoptext

这使

在此处输入图片描述

将 luatex/ConTeXt 模块“translate”移植到 luaLaTeX用于将模块移植translate到 luaLaTeX。

答案4

最好选择非字母字符,即尚未用于其他用途的字符,或仅在特殊情况下使用的字符。

|被一些软件包成对使用,用于逐字速记,但如果您不需要它,它是一个合理的候选者。 +<或者>可能是很好的候选者。如果您不需要带星号的 latex 命令或环境,那么可以使用*

我建议远离这些~#,,,,,,,,$当然@还有。%^_\

普通的 tex 可能比乳胶更容易让人接受,但当然你就无法享受现有包装的优势了。

相关内容