请将这个问题视为一个有争议的观点:
我想了解一些边缘情况,在这些情况下,TeX 在扩展过程中可能会遇到不同的标记,但不会传递错误消息,这些标记具有相同的含义和相同的\string
表示。
我说的“有同样的含义”是指
\ifx⟨token 1⟩⟨token 2⟩\expandafter\firstoftwo\else\expandafter\secondoftwo\fi
产量\firstoftwo
。
我所说的“相同\string
表示”是指产生与相同的标记集。\string⟨token 1⟩
\string⟨token 2⟩
我目前想到的极端情况:
- 冰冻
\relax
且\relax
原始。 - 无名控制序列(可通过
\csname\endcsname
或通过 .tex-input 行末尾的转义字符(反斜杠)产生,而\endlinechar
值为负)和名称为 的控制序列(可通过 产生),而这些控制序列具有相同的含义。csname⟨escapechar⟩endcsname
\csname csname\string\endcsname\endcsname
- 让 active-character-token 等于非活动吊坠。
- 单字母控制序列等于一个明确的字符标记,其中字符代码对应于形成控制序列名称的字符,而
\escapechar
具有负值。
还有更多极端情况吗?
例如,\inaccessible
TeX 在处理对齐时可能会插入诸如 或 之类的标记,那该怎么办呢?您可以定义\inaccessible
。您可以让它等于 TeX 的\inaccessible
吗?
答案1
另一种情况是通过应用\the
字体命令和原始字体命令本身获得的冻结字体控制序列。它们满足您的所有标准:
\documentclass{article}
\begin{document}
\makeatletter
% Let's assume that we loaded a font at some point:
\font\cmr cmr10
% Then we can get a second token for accessing the font using \the
\edef\tokens{\the\cmr\cmr}
% Compare their \string representations:
\edef\helpI{\expandafter\expandafter\expandafter\string\expandafter\@firstoftwo\tokens}
\edef\helpII{\expandafter\expandafter\expandafter\string\expandafter\@secondoftwo\tokens}
\ifx\helpI\helpII
They have the same \texttt{\string\string} representation.
\else
They have different \texttt{\string\string} representation.
\fi
\expandafter\ifx\tokens
They have the same meaning.
\else
They have different meaning.
\fi
% Now in case some people question that they are actually different, let's change the meaning of one of them and compare again.
\let\cmr\relax
\expandafter\ifx\tokens
They are identical.
\else
They are different tokens.
\fi
\makeatother
\end{document}