fontspec 包中的主字体干扰了 listings 环境中的 escapechar

fontspec 包中的主字体干扰了 listings 环境中的 escapechar

设置主字体之前的输出

在使用 fontspec 包设置主字体之前,运行escapechar正常。以下是输出图片:
设置主字体之前的输出
以下是我的 MWE:

\documentclass{memoir}

\usepackage{bigfoot} % to allow verbatim in footnote
\usepackage[numbered,framed]{matlab-prettifier}
\let\ph\mlplaceholder % shorter macro
\lstMakeShortInline"

\lstset{
    style              = Matlab-editor,
    basicstyle         = \mlttfamily,
    escapechar         = ",
    mlshowsectionrules = true,
}
\begin{document}
    
    \begin{lstlisting}[caption = {For educational purposes}]
        % example of while loop using placeholders
        while "\ph{condition}"
        if "\ph{something-bad-happens}"
        break
        else
        % do something useful
        end
        % do more things
        end
    \end{lstlisting}
    
\end{document}

设置主字体后的输出

将 Times New Roman 设置为主要字体后,它们escapechar现在显示为打开的方框,这是我不喜欢的。以下是输出图片:
设置主字体后的输出
以下是我的 MWE:

% !TeX TS-program = xelatex
\documentclass{memoir}

\usepackage{bigfoot} % to allow verbatim in footnote
\usepackage[numbered,framed]{matlab-prettifier}
\let\ph\mlplaceholder % shorter macro
\lstMakeShortInline"

\lstset{
    style              = Matlab-editor,
    basicstyle         = \mlttfamily,
    escapechar         = ",
    mlshowsectionrules = true,
}
\usepackage{fontspec}% added
\setmainfont{Times New Roman}
\begin{document}
    
    \begin{lstlisting}[caption = {For educational purposes}]
        % example of while loop using placeholders
        while "\ph{condition}"
        if "\ph{something-bad-happens}"
        break
        else
        % do something useful
        end
        % do more things
        end
    \end{lstlisting}
    
\end{document}

escapechar在存在主字体的情况下如何获得正确的效果?

答案1

matlab-prettifier包在其命令中使用(数学的文本版本)符号作为分隔符\placeholder

\newcommand\mlplaceholder[1]
{%
...   \phOpDelim@mlpr%
...    #1
...   \phClDelim@mlpr%
}

分隔符宏定义为:

\newcommand\phOpDelim@mlpr{\textlangle}
\newcommand\phClDelim@mlpr{\textrangle}

Times New Roman 没有这些符号。

类似这样的数学字体Asana-Math有这些,但我们想保留 Times New Roman。

latex 中的默认数学模式字体也有它们,因此我们可以重新定义分隔符以使用数学版本而不是文本伴随版本:

\makeatletter
\renewcommand\phOpDelim@mlpr{$\langle$}
\renewcommand\phClDelim@mlpr{$\rangle$}
\makeatother

或者,我们可以使用其他 (Unicode) 字体中的符号FreeSans。我们保留 matlab 命令不变,直接重新定义\textlangle\textrangle

\newfontface\fontangles{FreeSans}
\renewcommand\textlangle{{\fontangles 〈}}
\renewcommand\textrangle{{\fontangles 〉}}

或者,使用传统字体,这些符号位于 TS1 编码方案的插槽 60 和 62 中:

\newcommand\mytextlangle{{\usefont{TS1}{cmr}{m}{n}\char60}}
\newcommand\mytextrangle{{\usefont{TS1}{cmr}{m}{n}\char62}}

尖括号

平均能量损失

\documentclass{memoir}

\usepackage{bigfoot} % to allow verbatim in footnote
\usepackage[numbered,framed]{matlab-prettifier}
\let\ph\mlplaceholder % shorter macro
\lstMakeShortInline"

\lstset{
    style              = Matlab-editor,
    basicstyle         = \mlttfamily,
    escapechar         = ",
    mlshowsectionrules = true,
}
\usepackage{fontspec}% added
\setmainfont{Times New Roman}
\newfontface\fontangles{FreeSans}
\renewcommand\textlangle{{\fontangles 〈}}
\renewcommand\textrangle{{\fontangles 〉}}
%\makeatletter
%\renewcommand\phOpDelim@mlpr{$\langle$}
%\renewcommand\phClDelim@mlpr{$\rangle$}
%\makeatother
\newcommand\mytextlangle{{\usefont{TS1}{cmr}{m}{n}\char60}}
\newcommand\mytextrangle{{\usefont{TS1}{cmr}{m}{n}\char62}}

\begin{document}
    
    \begin{lstlisting}[caption = {For educational purposes}]
        % example of while loop using placeholders
        while "\ph{condition}" 
        if "\ph{something-happens}"
        break 
        else
        % do something useful
        end
        % do more things
        end
    \end{lstlisting}

legacy:  \mytextlangle x\mytextrangle

\end{document}

请注意,fontspec确实运行正常,转义字符也运行正常。任何没有这些符号的字体都会产生与 Times New Roman 相同的效果。

相关内容