我有个小问题^^<HEX>
。
如果我在宏中有<HEX>
一部分,我不能写成^^<HEX>
\def\attemp{<HEX>}
^^<HEX>
^^\attempt
或者\edef\attemptB{\noexpand^\noexpand^\attempt}
。
因为:
- TeX 的评估方式
^^\attempt
如下{^^\}attempt
...... - Tex 将识别
^
为上标字符并打印"! Missing $ inserted."
我的工作解决方案是:
\def\asciitochar#1{%
\def\attemp{#1}%
\def\att{\noexpand^\noexpand^\attempt\noexpand\endinput} % produce ^^#1\endinput%
\immediate\openout\mywrite=\noexpand^\noexpand^\attempt.gen.tex%
\immediate\write\mywrite{\att}%
\immediate\closeout\mywrite%
%
\input \noexpand^\noexpand^\attempt.gen.tex%
}
但上述解决方案并不“干净”(我认为:))。
有人有无需创建临时文件的解决方案吗......?
答案1
TeX^^<number>
很早就完成了 char 转换,并且必须在标记化期间进行。传统的 TeX 无法为您提供解决所提出问题的好方法:您必须写入文件并读回。在普通的 TeX 中,我会这样做
\newwrite\mywrite
\catcode`\@=11 %
\def\asciitochar#1{%
\def\ascii{#1}%
\begingroup
\toks@\expandafter{\expandafter^\expandafter^\ascii}%
\immediate\openout\mywrite=\jobname.txt %
\immediate\write\mywrite{\the\toks@}%
\immediate\closeout\mywrite
\endgroup
\input\jobname.txt %
}
\asciitochar{41}
\bye
有了 e-TeX,你可以\scantokens
使用
\def\asciitochar#1{%
\def\ascii{#1}%
\scantokens\expandafter{\expandafter^\expandafter^\ascii}%
}
\asciitochar{41}
\bye
(你没有在问题中说,但大概在真实情况下,在你获取它之前,该数字已经作为宏存储,否则你会直接使用它。)
答案2
该^^
符号仅在标记化期间有效,因此在宏扩展发生之前就有效。
如果您希望将其\asciitochar{41}
写入A
文件,A.gen.tex
您可以这样做:
\newwrite\mywrite
\begingroup\catcode`\^^@=12 % ^^@ has usually category code 9
\def\x{\endgroup
\def\asciitochar##1{%
\begingroup
\lccode`\^^@="##1\relax
\lowercase{\endgroup
\immediate\openout\mywrite=^^@.gen.tex
\immediate\write\mywrite{^^@\noexpand\endinput}%
\immediate\closeout\mywrite
\input ^^@.gen.tex
}
}
}\x
\asciitochar{41}
\bye
通过\lowercase
和的设置\lccode`\^^@="#1
可以将每一个字符转换成 ASCII 码(十六进制)^^@
的真实字符。#1
答案3
\def\asciitochar#1{%
\begingroup
\uccode`a="#1\relax
\uppercase{\endgroup\input a}.tex }
\asciitochar{41}
\asciitochar{42}
\bye
将输入 A.tex 然后输入 B.tex:
$ pdftex zz44
This is pdfTeX, Version 3.1415926-2.5-1.40.14 (TeX Live 2013)
restricted \write18 enabled.
entering extended mode
(./zz44.tex (./A.tex) (./B.tex) )
No pages of output.
Transcript written on zz44.log.