^^ 有问题

^^ 有问题

我有个小问题^^<HEX>

如果我在宏中有<HEX>一部分,我不能写成^^<HEX>\def\attemp{<HEX>}^^<HEX>

  1. ^^\attempt或者
  2. \edef\attemptB{\noexpand^\noexpand^\attempt}

因为:

  1. TeX 的评估方式^^\attempt如下{^^\}attempt......
  2. 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.

相关内容