几年前,为了解决 reledmac 的问题,我问了一个关于使活跃角色不活跃的最佳方法的问题。
inputenc、active catcode 和 \csnsame
答案是使用 的\detokenize
宏etex
。
但是这个宏也使控制序列字符 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