我已经定义了一个命令(映射命令) 将给定的文本转换为另一种形式。但是,在文章中,使用该命令后,它会更改其下方的字体。我的意思是,字体保持 Times New Roman 直到我使用该命令,使用该命令后,它会将其下方的所有文本的字体更改为 CharisSil。我想仅在命令内的文本中使用 CharisSil 字体。我尝试了 \DeclareTextFontCommand,但无法正常工作。请参阅下面的 MWE。谢谢。编译器:XeLatex
\documentclass{article}
\RequirePackage{CharisSIL}
\newfontface\mapfnt{CharisSIL-R.ttf}
\makeatletter
\def\zztable#1{#1}
\def\zzrow#1#2{\expandafter\gdef\csname B-#2\endcsname{#1}}
\def\mapcommand#1{\mapfnt\xxconvert#1@}
\def\xxconvert{\futurelet\tmp\xxxconvert}
\def\xxxconvert{%
\ifx\tmp\@sptoken\space\fi
\xxxxconvert
}
\def\xxxxconvert#1{%
\expandafter\ifx\csname B-#1\endcsname\relax?%
\expandafter\show\csname B-#1\endcsname
\fi
\csname B-#1\endcsname
\xxconvert}
\expandafter\def\csname B-@\endcsname#1{}
\input{maps}
\makeatother
\setmainfont{Times New Roman}
\begin{document}
The font of this line Times new roman as expected. \mapcommand{০১২৩৪} However, from here font changes after the use of the command.
\end{document}
地图.文本
\zztable{
\zzrow{0}{০}
\zzrow{1}{১}
\zzrow{2}{২}
\zzrow{3}{৩}
\zzrow{4}{৪}
}
答案1
您必须本地化字体更改:
\def\mapcommand#1{{\mapfnt\xxconvert#1@}}% <-- add braces!
您还可以考虑这个更简单的实现:
\documentclass{article}
\usepackage{fontspec}
\setmainfont{Times New Roman}
\newfontface\mapfnt{Charis SIL}
\ExplSyntaxOn
\NewDocumentCommand{\conversiontable}{m}
{
\tl_set:Nn \l_israt_convert_table_tl { #1 }
\tl_reverse:N \l_israt_convert_table_tl
}
\NewExpandableDocumentCommand{\mapcommand}{m}
{
\str_map_function:nN { #1 } \israt_convert_token:n
}
\tl_new:N \l_israt_convert_table_tl
\cs_new:Nn \israt_convert_token:n
{
{ \mapfnt \str_case:nV { #1 } \l_israt_convert_table_tl }
}
\ExplSyntaxOff
\conversiontable{
{0}{০}
{1}{১}
{2}{২}
{3}{৩}
{4}{৪}
}
\begin{document}
The font of this line is Times New Roman as expected. \mapcommand{০১২৩৪}
The font is again Times.
\end{document}
答案2
虽然你没有说你想做什么,但你可能有一个XY问题。也就是说,如果您的实际目标是能够显示源中显示为 ASCII 数字的阿萨姆语数字,那么有更简单的方法可以实现。这在 LuaLaTeX 中有效:
\documentclass{article}
\tracinglostchars=3 % Halt if a font cannot display a glyph.
\usepackage[english, bidi=basic]{babel}
\usepackage{fontspec}
\usepackage[paperwidth=10cm]{geometry} % To format the MWE for TeX.SX.
\babelprovide[import, mapdigits]{bengali}
\defaultfontfeatures{ Scale=MatchUppercase, Ligatures=TeX }
\babelfont{rm}
[Scale=1.0]{TeX Gyre Termes}
% Noto Serif Bengali is available at:
% https://www.google.com/get/noto/#sans-beng
\babelfont[bengali]{rm}
{Noto Serif Bengali}
\begin{document}
This text is in Termes. \foreignlanguage{bengali}{01234}
Now back to Termes.
\end{document}
如果您确实想反过来进行转换,@egreg 提供了一个很好的答案。 (但请考虑更改您的输入法。)