获取字符串 (在 中pdflatex
) 的 LICR 表示的一种方法是使用\protected@edef
。例如:
\documentclass{article}
\usepackage[cp1252]{inputenc}
\begin{document}
\makeatletter
\protected@edef\result{^^f6}
\show\result
\end{document}
印刷
> \result=macro:
->\"o.
到目前为止,一切都很好。
以前,如果编码为 ,则此方法有效utf8
。使用 TL2018:
\documentclass{article}
\usepackage[utf8]{inputenc}
\begin{document}
\makeatletter
\protected@edef\result{^^c3^^b6} % ie, ^^f6 in UTF-8 encoding
\show\result
\end{document}
显示内容如下:
> \result=macro:
->\IeC {\"o}.
但我刚刚意识到它不再起作用,因为现在它返回的是实际的字符:
> \result=macro:
->ö.
这意味着无法以独立于编码的方式操作生成的字符串。行为发生这种变化的原因是字符现在是\protected
(eTeX 原语),从而阻止了对其内部定义(又名 LICR)的扩展。
- 有没有办法让它们不再
\protected
重新定义字符,而每次生成 LICR 时都无需重新定义字符? - 或者更一般地说,是否有其他方法来生成 LICR 表示
utf8
,如使用cp1252
和applemac
其他 8 位编码。
答案1
定义\getlicr
如下:
\documentclass{article}
\ExplSyntaxOn
\NewDocumentCommand{\getlicr}{mm}{%
\cs_set_eq:Nc #1 { u8:\tl_to_str:n {#2} }
}
\ExplSyntaxOff
\getlicr{\result}{^^c3^^b6}
\show\result
\getlicr{\result}{ö}
\show\result
\stop
控制台输出:
> \result=macro:
->\IeC {\"o}.
l.10 \show\result
?
> \result=macro:
->\IeC {\"o}.
l.13 \show\result
经过一些延伸……
\documentclass{article}
\ExplSyntaxOn
\NewDocumentCommand{\getlicr}{mm}
{
\javier_getlicr:nn { #1 } { #2 }
}
\tl_new:N \g__javier_licr_item_tl
\seq_new:N \l__javier_licr_in_seq
\seq_new:N \l__javier_licr_out_seq
\cs_new_protected:Nn \javier_getlicr:nn
{
\seq_set_split:Nnn \l__javier_licr_in_seq { ~ } { #2 }
\seq_clear:N \l__javier_licr_out_seq
\seq_map_function:NN \l__javier_licr_in_seq \__javier_licr:n
\tl_set:Ne #1 { \seq_use:Nn \l__javier_licr_out_seq { ~ } }
}
\cs_new_protected:Nn \__javier_licr:n
{
\tl_gclear:N \g__javier_licr_item_tl
\text_map_function:nN { #1 } \__javier_licr_item:n
\group_begin:
\cs_set:Npn \IeC ##1 { \exp_not:n { ##1 } }
\tl_gset:Ne \g__javier_licr_item_tl { \g__javier_licr_item_tl }
\group_end:
\seq_put_right:NV \l__javier_licr_out_seq \g__javier_licr_item_tl
}
\cs_new_protected:Nn \__javier_licr_item:n
{
\tl_if_single:nTF { #1 }
{
\tl_gput_right:Nn \g__javier_licr_item_tl {#1}
}
{
\tl_gput_right:Nv \g__javier_licr_item_tl { u8:\tl_to_str:n {#1} }
}
}
\ExplSyntaxOff
\begin{document}
\getlicr{\result}{^^c3^^b6}
\texttt{\meaning\result} $\to$ \result
\getlicr{\result}{eäñçîw xyž}
\texttt{\meaning\result} $\to$ \result
\end{document}
答案2
你不应该需要这个:-)但是...
\documentclass{article}
\usepackage[utf8]{inputenc}
\begin{document}
\makeatletter
{
\def\IeC#1{\unexpanded{\IeC{#1}}}
\expandafter
\edef
\expandafter
\result
\expandafter
{^^c3^^b6} % ie, ^^f6 in UTF-8 encoding
\show\result
}
\stop
生产
> \result=macro:
->\IeC {\"o}.
l.18 \show\result
答案3
我怀疑你是在追求\text_purify:n
:
\documentclass{article}
\usepackage[cp1252]{inputenc}
\ExplSyntaxOn
\let\expander\text_purify:n
\ExplSyntaxOff
\begin{document}
\makeatletter
\edef\result{\expander{^^f6}}
\show\result
\end{document}
这应该尽可能为大多数输入编码提供 UTF-8 表示(在某个阶段可能需要扩展以覆盖至少全部 PU)。