设置主字体之前的输出
在使用 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 相同的效果。