是否存在使用某些代码“翻译”标记的现有宏?例如:
\def\code{{{a,b},{b,c},{c,a}}}
\translate[\code]{caac} % => would typeset "abba"
或者更好的是这样的:
\def\code{{{ab,ba},{ac,ca},{b,c}{c,b}}}
\translate[\code]{abbcac} % => would typeset "bacbca"
代码定义的语法并不重要。
如果不存在这样的宏,那么欢迎任何提议来获得该问题的有效解决方案。
谢谢 :)
答案1
(编辑:我最初的答案的第一个解析器没有使用正确的规则。)
以下是 TikZ/PGF 解决方案:
\documentclass{standalone}
\usepackage{pgf}
\usepgfmodule{parser}
\pgfparserdef{myparser}{initial}{the letter a}{b}
\pgfparserdef{myparser}{initial}{the letter b}{c}
\pgfparserdef{myparser}{initial}{the letter c}{a}
\pgfparserdef{myparser}{initial}{the character ;}{\pgfparserswitch{final}}
\pgfparserdef{myparser2}{initial}{the letter a}{\pgfparserswitch{s2}}
\pgfparserdef{myparser2}{s2}{the letter b}{ba\pgfparserswitch{initial}}
\pgfparserdef{myparser2}{s2}{the letter c}{ca\pgfparserswitch{initial}}
\pgfparserdef{myparser2}{initial}{the letter b}{c}
\pgfparserdef{myparser2}{initial}{the letter c}{b}
\pgfparserdef{myparser2}{initial}{the character ;}{\pgfparserswitch{final}}
\newcommand\myparserone[1]{%
\expandafter\pgfparserparse\expandafter{\expandafter myparser\expandafter}#1;%
}
\newcommand\myparsertwo[1]{%
\expandafter\pgfparserparse\expandafter{%
\expandafter myparser2\expandafter}#1;%
}
\begin{document}
\textbf{\pgfparserparse{myparser}caac; \pgfparserparse{myparser2}abbcac;}
\emph{\myparserone{caac} \myparsertwo{abbcac}}
\end{document}
结果:
答案2
第一个方案的一个合理有效的实现是
\def\translate[#1]#2{{%
\expandafter\xlc#1\relax
\lowercase{#2}}}
\def\xlc#1{%
\ifx\relax#1\else
\xxlc#1%
\expandafter
\xlc
\fi}
\def\xxlc#1,#2{\lccode`#1=`#2 }
\def\code{{a,b}{b,c}{c,a}}
\translate[\code]{caac}
\bye
如果通过纯 TeX 运行,则会排版 abba。