为什么设置 `\XeTeXinterwordspaceshaping = 2` 会导致两个连续的 `\fontspec` 出现问题?

为什么设置 `\XeTeXinterwordspaceshaping = 2` 会导致两个连续的 `\fontspec` 出现问题?

我在设置\fontspec和时遇到了一个奇怪的问题。如果我在一行中连续\XeTeXinterwordspaceshaping = 2使用多个 in ,就会出现错误。所有带有注释的行(行上方或右侧)都会导致错误。请注意第一行末尾和第二行开头之前的空格之间的细微差别。令我惊讶的是,最后两行再次起作用,尽管它们与第 32 行和第 35 行完全相同。我想第 38 行一定以某种方式抑制了错误。\fontspec% problem\fontspec

如果我删除\XeTeXinterwordspaceshaping = 2,它们都可以正常工作。但我需要它,以便我的缅甸语文本正确对齐。

尽管我可以使用这些可以满足我需求的解决方法,但我很好奇为什么会发生这个问题。

\documentclass[twoside, openright]{book}
\XeTeXlinebreaklocale "my_MM"  %Myanmar line and character breaks
\XeTeXinterwordspaceshaping = 2

\usepackage{fontspec}
\usepackage[dvipsnames]{xcolor}
\usepackage{xspace}

\newcommand{\class}{\myCodePar{class}}
\newcommand{\turnLeft}{\myCodePar{turnLeft}}

\newcommand{\myCodePar}[1]{{\fontspec[Scale=1, Script=Latin]{Ubuntu Mono} #1}}

\definecolor{myParColor}{HTML}{4E4D4D}
\definecolor{myParColor1}{HTML}{4E4D4E}


\begin{document}

%\noindent\myCodePar{MeetKarel}\class\ \turnLeft  % problem

%\noindent\myCodePar{MeetKarel} \class\ \turnLeft % problem

%\noindent\myCodePar{MeetKarel}~\class\ \turnLeft % problem

\noindent\myCodePar{MeetKarel }\class\ \turnLeft  % okay




% problem (note: if i set different color to these two fontspec, it works)
%\noindent {\fontspec[Color=myParColor]{Ubuntu Mono} MeetKarel} {\fontspec[Color=myParColor]{Ubuntu Mono} class}

% problem (note: if i set different color to these two fontspec, it works)
%\noindent {\fontspec[Color=myParColor]{Ubuntu Mono} MeetKarel}~{\fontspec[Color=myParColor]{Ubuntu Mono} class}

% okay
\noindent {\fontspec[Color=myParColor]{Ubuntu Mono} MeetKarel}{\fontspec[Color=myParColor]{Ubuntu Mono} class}

% okay
\noindent {\fontspec[Color=myParColor]{Ubuntu Mono} MeetKarel }{\fontspec[Color=myParColor]{Ubuntu Mono} class}

% okay !Same as line 35, but it works here, not there
\noindent {\fontspec[Color=myParColor]{Ubuntu Mono} MeetKarel}~{\fontspec[Color=myParColor]{Ubuntu Mono} class}

% okay !Same as line 32, but it works here, not there
\noindent {\fontspec[Color=myParColor]{Ubuntu Mono} MeetKarel} {\fontspec[Color=myParColor]{Ubuntu Mono} class}

\end{document}

答案1

绝对不建议使用\fontspec:您总是不断重新计算相同的设置。

而是定义一个字体命令。

\documentclass[twoside, openright]{book}
\XeTeXlinebreaklocale "my_MM"  %Myanmar line and character breaks
\XeTeXinterwordspaceshaping = 2

\usepackage{fontspec}
\usepackage[dvipsnames]{xcolor}

\newfontfamily{\ubuntumono}{Fira Mono}[Script=Latin]% replace Fira with Ubuntu
\DeclareTextFontCommand{\textubuntumono}{\ubuntumono}

\newcommand{\class}{\myCodePar{class}}
\newcommand{\turnLeft}{\myCodePar{turnLeft}}

\NewDocumentCommand{\myCodePar}{om}{%
  % #1 = optional color, #2 = text
  \textubuntumono{\IfValueT{#1}{\addfontfeatures{Color=#1}}#2}%
}

\definecolor{myParColor}{HTML}{4E4D4D}
\definecolor{myParColor1}{rgb}{1,0,0}


\begin{document}

\noindent\myCodePar{MeetKarel}\class\ \turnLeft  % problem

\noindent\myCodePar{MeetKarel} \class\ \turnLeft % problem

\noindent\myCodePar{MeetKarel}~\class\ \turnLeft % problem

\noindent\myCodePar{MeetKarel }\class\ \turnLeft  % okay

\noindent \myCodePar[myParColor]{MeetKarel} \myCodePar[myParColor]{class}

\noindent \myCodePar[myParColor1]{MeetKarel} \myCodePar[myParColor]{class}

\end{document}

在此处输入图片描述

我的系统上没有 Ubuntu Mono,所以我用 Fira Mono 替换了它,但这基本无关紧要。

无论如何,您的代码出现分段错误的事实应该进行调查。

相关内容