如果我使用^^J
或\iow_newline:
,它会打印 a\Omega
而不是换行符。知道我错在哪里了吗?
\documentclass{article}
\ExplSyntaxOn
\NewDocumentCommand{\printTwiceWithNewline}{v}{
\str_clear_new:N \l_test_str
\str_gput_right:Nx \l_test_str {\tl_to_str:N{#1}^^J\tl_to_str:N{#1}}
\str_gput_right:Nx \l_test_str {\iow_newline:\tl_to_str:N{#1}}
\begin{flushleft}\ttfamily
\l_test_str
\end{flushleft}
}
\ExplSyntaxOff
\begin{document}
\printTwiceWithNewline{Test}
\end{document}
答案1
讲话您的需求,基本上您希望能够在两种用途之间进行更改^^J
。\par
一种简单的方法是为可能的换行符定义一个临时替代宏。在写入文件之前重新定义它,并在以 PDF 格式打印之前重新定义它。
这是一个 LaTeX2e 示例:
\documentclass{article}
\newcommand\fakeLF{}
\newcommand\teststring{Test\fakeLF Test\fakeLF Test}
\begin{document}
\renewcommand\fakeLF{^^J}
\message{\teststring}
\renewcommand\fakeLF{\par}
\teststring
\end{document}
对于您询问的有关 Omegas 的字面问题:这是因为^^J
生成 unicode0x000a
换行符,而使用默认的 OT1 字体编码,这恰好会生成大写的 Omega 字符。例如,如果您切换到 ,则行为会有所不同\usepackage[T1]{fontenc}
。
答案2
(仅解释正在发生的事情。)
TeX 书中解释道(第 45 页)
如果 ^^ 后面的字符的内部代码在 64 到 127 之间,则 TEX 从该代码中减去 64;如果该代码在 0 到 63 之间,则 TEX 加上 64。
(也可以看看这个答案以解释双插入符号符号。)
大写字母J
的字符代码为 74(您可以通过键入\number`J
或查看 ASCII 表来找到),因此根据上述规则,键入^^J
与要求实际字体中插槽 74-64=10 中的字符相同。这显然取决于当前的字体编码:
\documentclass{article}
\begin{document}
\number`J
OT1: ^^J (same as \char10)
\fontencoding{T1}\selectfont
T1: ^^J (same as \char10)
\end{document}
LaTeX 内核确实如此,但这仅在s\newlinechar`\^^J
内有效。\write
答案3
tl
我实际上选择了转换为字符串并^^J
用\par
和 空格替换的解决方案\
:
\documentclass{article}
\ExplSyntaxOn
\NewDocumentCommand{\printTwiceWithNewline}{v}{
\str_clear_new:N \l_test_str
\str_gput_right:Nx \l_test_str {\tl_to_str:N{#1}^^J\space\space\space\tl_to_str:N{#1}}
\str_gput_right:Nx \l_test_str {\iow_newline:\tl_to_str:N{#1}}
%%% replace
\tl_set_eq:NN \l_robExt_tmp_str \l_test_str
\tl_replace_all:Nnn \l_robExt_tmp_str {^^J} { \par }
\tl_replace_all:Nnn \l_robExt_tmp_str { ~ } { \ }
\begin{flushleft}\ttfamily
\l_robExt_tmp_str
\end{flushleft}
}
\ExplSyntaxOff
\begin{document}
\printTwiceWithNewline{Test}
\end{document}