我对音译映射很感兴趣。我正在做一个使用音译的项目。我见过一些解决此问题的代码。但我能理解它们。例如,
\def\tcmapto#1#2{\expandafter\def\csname tcmapto\number`#1\endcsname{#2}}
\def\tcmapnumto#1#2{\expandafter\def\csname tcmapto#1\endcsname{#2}}
\def\tcremap#1{\ifcsname tcmapto\number`#1\endcsname
\csname tcmapto\number`#1\endcsname\else#1\fi}
问题:这三行是如何逐行工作的。有人能耐心解释一下吗?谢谢。
完整代码:
\documentclass{article}
\usepackage{tokcycle}
\def\tcmapto#1#2{\expandafter\def\csname tcmapto\number`#1\endcsname{#2}}
\def\tcmapnumto#1#2{\expandafter\def\csname tcmapto#1\endcsname{#2}}
\def\tcremap#1{\ifcsname tcmapto\number`#1\endcsname
\csname tcmapto\number`#1\endcsname\else#1\fi}
\tcmapto{ং}{n}% OR \tcmapnumto{2434}{n}
\tcmapto{আ}{Ā}% OR \tcmapnumto{2438}{Ā}
\tcmapto{ন}{n}% OR \tcmapnumto{2472}{n}
\tcmapto{ব}{b}% OR \tcmapnumto{2476}{b}
\tcmapto{ম}{m}% OR \tcmapnumto{2478}{m}
\tcmapto{র}{ra}% OR \tcmapnumto{2480}{ra}
\tcmapto{ল}{l}% OR \tcmapnumto{2482}{l}
\tcmapto{স}{s}% OR \tcmapnumto{2488}{s}
\tcmapto{া}{ā}% OR \tcmapnumto{2494}{ā}
\tcmapto{ো}{ō}% OR \tcmapnumto{2507}{ō}
\begin{document}
\Characterdirective{\addcytoks[x]{\tcremap{#1}}}
\tokencyclexpress
আমার সোনার বাংলা
আ-মা-র সো-না-র বাং-লা
\endtokencyclexpress
\end{document}
答案1
\def\tcmapto#1#2{\expandafter\def\csname tcmapto\number`#1\endcsname{#2}}
定义\tcmapto
的方式是,每次调用该形式\tcmapto{A}{B}
都会定义一个名称为
\tcpmapto<character code of A>
扩展为B
。这样将\tcmapto
的音译存储在新的宏 中。例如,A
B
\tcpmapto<character code of A>
\tcmapto{a}{b}
\tcmapto97
定义将扩展为b
(97
是 的字符代码)的命令a
。
\def\tcmapnumto#1#2{\expandafter\def\csname tcmapto#1\endcsname{#2}}
作用相同,但\tcmapnumto
将字符代码本身作为第一个参数,而不是字符。例如,
\tcmapnumto{97}{b}
\tcmapto97
还定义了将扩展为的命令b
。
\def\tcremap#1{\ifcsname tcmapto\number`#1\endcsname\csname tcmapto\number`#1\endcsname\else#1\fi}
\tcremap{A}
检查宏是否\tcmapto<character code of A>
存在,如果存在,则执行它。否则输出A
。效果是,如果已设置此音译,则\tcremap{A}
音译A
为,否则输出。B
A
基本构成要素。
\csname ... \endcsname
从中间的任何内容构造一个命令名称,并在过程中扩展宏。\csname
在定义不寻常的宏名称(例如其中包含数字的宏名称)时很有用。\def\macroname{expansion}
\macroname
定义要扩展为的宏expansion
。\expandafter\def\csname ... \endcsname
意思是:先展开\csname ... \endcsname
得到宏名,然后再定义。如果没有\expandafter
,\def
则会重新定义宏名\csname
本身。\ifcsname ... \endcsname <then branch> \else <else branch> \fi
\ifcsname
:如果和之间的字符\endcsname
是现有宏的名称,则执行<then branch>
,否则执行<else branch>
。\number`<character>
扩展为<character>