我的设置: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 argument
或File ended while scanning use of
错误停止。
当定义带有分隔参数的宏时,参数后面应该跟有分隔符的准确标记序列:字符代码和类别代码会被考虑用于字符标记;分隔符中的符号标记(即控制序列)不需要定义,但名称必须匹配。