在扩展阶段可能出现不同标记具有相同含义和相同 \string 表示的情况

在扩展阶段可能出现不同标记具有相同含义和相同 \string 表示的情况

请将这个问题视为一个有争议的观点:

我想了解一些边缘情况,在这些情况下,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具有负值。

还有更多极端情况吗?

例如,\inaccessibleTeX 在处理对齐时可能会插入诸如 或 之类的标记,那该怎么办呢?您可以定义\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}

在此处输入图片描述

相关内容