映射在音译中如何起作用?

映射在音译中如何起作用?

我对音译映射很感兴趣。我正在做一个使用音译的项目。我见过一些解决此问题的代码。但我能理解它们。例如,

\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的音译存储在新的宏 中。例如,AB\tcpmapto<character code of A>

\tcmapto{a}{b}

\tcmapto97定义将扩展为b97是 的字符代码)的命令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为,否则输出。BA


基本构成要素。

  • \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>

相关内容