使用 UTF-8 的 LICR 表示

使用 UTF-8 的 LICR 表示

获取字符串 (在 中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,如使用cp1252applemac其他 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)。

相关内容