使用 fontspec 和 XeTeX 对打字机进行连字处理/避免代码中的 \hboxes 过满

使用 fontspec 和 XeTeX 对打字机进行连字处理/避免代码中的 \hboxes 过满

我想避免\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}

xelatex 输出

我希望在Match和之间Lowercase以及{\foo}和之间有连字符点(手动指令可以) {bar}。但是,我永远不希望连字符出现在连字符点处(在打字机文本中)。

我试过了\-,但是不起作用(不适babelshorthands用于english)。我也知道选项fontspecHyphenChar但我不知道如何告诉它“没有连字符,但有连字符”(空格 /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}

在此处输入图片描述

但我必须在文本部分明确添加一个断点。

相关内容