仅对活跃角色进行去标记

仅对活跃角色进行去标记

几年前,为了解决 reledmac 的问题,我问了一个关于使活跃角色不活跃的最佳方法的问题。

inputenc、active catcode 和 \csnsame

答案是使用 的\detokenizeetex

但是这个宏也使控制序列字符 catcode 变为 12。它直接用于在 reledmac 中的一些特定情况下创建一些 bug(这里太复杂了,无法解释原因)。

我想要将已经读取的 catcode 为 13 的字符转换为 catcode 为 12 的字符,但能够读取\等等,因为我在\edef定义中需要它们。

这里是 MWE

\documentclass{article}
\usepackage[polutonikogreek]{babel}
\usepackage[utf8]{inputenc}

\begin{document}
\def\emph#1{#1}

\expandafter\def\csname a\endcsname{toto}

%\edef\one{a \emph{ω a}}%That can't work

\edef\two{\detokenize{a \emph{ᾧ a}}}

\show\two%->a \emph {ᾧ a}
% What I would like is to set definition of two to
% a ᾧ a
% While ᾧ inactive character
\end{document}

答案1

使用当前的乳胶,您可以使用\protected@edef

\documentclass{article}
\usepackage[polutonikogreek]{babel}
\usepackage[utf8]{inputenc}

\begin{document}
\def\emph#1{#1}

\makeatletter
\protected@edef\two{a \emph{ᾧ a} \textbf{a}}
\show\two%

\end{document}

得出:

> \two=macro:
->a ᾧ a \protect \textbf  {a}.

答案2

首先,\detokenize是 e-TeX原始,不是宏。:-)

那这个呢?

\documentclass{article}
\usepackage[polutonikogreek]{babel}
\usepackage[utf8]{inputenc}
\usepackage{xparse}

\ExplSyntaxOn

\tl_new:N \g__maieul_tmp_tl
\cs_generate_variant:Nn \tl_to_str:n { e }

\NewDocumentCommand \myConversionFunc { m m }
  {
    \group_begin:
      \clist_map_inline:nn { \emph, \textbf } % you can add more, of course
        { \cs_set_eq:NN ##1 \use:n }

      \tl_gset:Nx \g__maieul_tmp_tl { \tl_to_str:e { \text_expand:n {#2} } }
    \group_end:
    \tl_set_eq:NN #1 \g__maieul_tmp_tl
  }

\ExplSyntaxOff

\begin{document}

\myConversionFunc{\result}{a \emph{ᾧ a}}
\show\result

\myConversionFunc{\result}{a ᾧ \textbf{éêè }\emph{ᾧ a} Û}
\show\result

\end{document}

终端输出:

> \result=macro:
->a ᾧ a.
l.27 \show\result

> \result=macro:
->a ᾧ éêè ᾧ a Û.
l.30 \show\result

如果这不是您想要的,请解释“但能够阅读\等等,因为我在\edef定义中需要它们”的意思。

注:据我所知,\text_expand:n是最近添加的。expl3

相关内容