关于 pdftexmagfix.tex 的问题

关于 pdftexmagfix.tex 的问题

我的设置:TL2014

我明白 pdftexmagfix.tex 的用途,但我不知道它是如何工作的:

如果我们改变

\begingroup
  \catcode`P=12
  \catcode`T=12
  \lowercase{%
\endgroup
\def\ppdfconvert@truept#1PT{#1truept}%
  }%

\def\ppdfconvert@truept#1pt{#1truept}%

我们得到这个错误:

! File ended while scanning use of \ppdfconvert@truept.

为什么会产生这个错误以及为什么要设置catcode

答案1

该宏用于

\def\ppdfmag@fix#1{#1=\expandafter\ppdfconvert@truept\the#1\relax}

\the\pdfhorigin展开时,它会返回类似的内容123.45pt(或其他内容),所有字符的类别代码为 12(这在返回字符串的 TeX 操作中总是发生,只有空格才会接收类别代码 10)。

因此,参数\ppdfconvert@truept必须由类别代码为 12 的字符分隔,这就是上述代码所做的,利用了\lowercase永远不会改变类别代码而只改变字符代码的事实。

请注意,类别代码的分配是由 撤消的\endgroup,但仅在\lowercase完成其任务后才可撤消。

替代道路

\begingroup
\edef\otherpt{%
  \endgroup\def\noexpand\ppdfconvert@truept##1\string p\string t}%
\otherpt{#1truept}

就笨拙得多。


如果您按照自己的方式继续操作,宏\ppdfconvert@truept会期望后面跟着任意标记,直到找到pt,两者都带有类别代码 11,但它直到第一个\par或文件末尾才找到,因此 TeX 会以Runaway argumentFile ended while scanning use of错误停止。

当定义带有分隔参数的宏时,参数后面应该跟有分隔符的准确标记序列:字符代码类别代码会被考虑用于字符标记;分隔符中的符号标记(即控制序列)不需要定义,但名称必须匹配。

相关内容