![使用 fontspec 和 XeTeX 对打字机进行连字处理/避免代码中的 \hboxes 过满](https://linux22.com/image/259593/%E4%BD%BF%E7%94%A8%20fontspec%20%E5%92%8C%20XeTeX%20%E5%AF%B9%E6%89%93%E5%AD%97%E6%9C%BA%E8%BF%9B%E8%A1%8C%E8%BF%9E%E5%AD%97%E5%A4%84%E7%90%86%2F%E9%81%BF%E5%85%8D%E4%BB%A3%E7%A0%81%E4%B8%AD%E7%9A%84%20%5Chboxes%20%E8%BF%87%E6%BB%A1.png)
我想避免\hbox
由于内联代码插入\textt{foo}
或而导致的过度填充\ttfamily
,例如在此 MWE 中:
% compile with xelatex
\documentclass{article}
\usepackage[textwidth=4cm, showframe]{geometry}% to force hyphenation
\usepackage{polyglossia}
\setdefaultlanguage[variant=usmax]{english}
\usepackage{fontspec}
\setmonofont[Scale=MatchLowercase]{DejaVu Sans Mono}
\setlength{\overfullrule}{1mm}
\begin{document}
{\ttfamily Bla \textbackslash newcommand\{\textbackslash foo\}\{bar\}
\textbackslash setmonofont[Scale=MatchLowercase]\{DejaVu Sans Mono\}
For regular words, it works supercalifragilisticexpialidociously (or more like kind of ok),
but real code is tricky.}
\end{document}
我希望在Match
和之间Lowercase
以及{\foo}
和之间有连字符点(手动指令可以) {bar}
。但是,我永远不希望连字符出现在连字符点处(在打字机文本中)。
我试过了\-
,但是不起作用(不适babelshorthands
用于english
)。我也知道选项fontspec
,HyphenChar
但我不知道如何告诉它“没有连字符,但有连字符”(空格 /32
不是一个选项,因为它出现在 pdf 的 OCR 层中;None
会完全禁用连字符)。我想这些可能都是解决方案的痕迹,但我不知道如何使用它们。
答案1
第一次尝试使用空格字符作为连字符,但后来我意识到原贴作者明确表示这是不行的。因此下面进行了第二次尝试,没有使用空格(或其他)字符。
以下对我有用(我注释掉了 DejaVu Sans Mono 行,因为某种原因它在我的安装上不起作用,试图添加 ExternalLocation 作为选项,但这并没有解决问题,而且我不经常使用 XeTeX 或 LuaTeX 来进一步调查问题的原因)
% compile with xelatex
\documentclass{article}
\usepackage[textwidth=4cm, showframe]{geometry}% to force hyphenation
\usepackage{polyglossia}
\setdefaultlanguage[variant=usmax]{english}
\usepackage{fontspec}
% \setmonofont[Scale=MatchLowercase]{DejaVu Sans Mono}
\setlength{\overfullrule}{1mm}
\begin{document}
{\ttfamily\hyphenchar\font32
Bla \textbackslash newcommand\{\textbackslash foo\}\-\{bar\}
\textbackslash setmonofont[Scale=\-Match\-Lowercase]\{DejaVu Sans Mono\}
For regular words, it works supercalifragilisticexpialidociously (or more like
kind of ok), but real code is tricky.}
\end{document}
注意空格被用作连字符。我\-
在代码中添加了一些。
我现在读到你的“空间不是一个选择”,它可能会取消我的尝试!所以这是第二次尝试:
% compile with xelatex
\documentclass{article}
\usepackage[textwidth=4cm, showframe]{geometry}% to force hyphenation
\usepackage{polyglossia}
\setdefaultlanguage[variant=usmax]{english}
\usepackage{fontspec}
% \setmonofont[Scale=MatchLowercase]{DejaVu Sans Mono}
\setlength{\overfullrule}{1mm}
\begin{document}
{\ttfamily\def\-{\discretionary{}{}{}}%
Bla \textbackslash newcommand\{\textbackslash foo\}\-\{bar\}
\textbackslash setmonofont[Scale=\-Match\-Lowercase]\{DejaVu Sans Mono\}
For regular words, it works supercalifra\-gilisticexpialidociously (or more like
kind of ok), but real code is tricky.}
\end{document}
但我必须在文本部分明确添加一个断点。