当在宽度可变的对齐段落中使用等宽段时,等宽部分通常会“晚一个字”换行,从而导致许多行超出水平盒子的范围。
已经有几个关于文本断行的问题了\texttt
,但所有问题都用连字符解决了,但这不是我想要的。空白处有充足的换行机会,而且 LaTeX 确实会选择一个,但它不是正确的。
MWE(在 LuaLaTeX 中设置 - 其他的有同样的问题,但由于它依赖于字体,所以位置可能会略有不同):
\documentclass[english]{article}
\usepackage{fontspec}
\usepackage{microtype}
\usepackage{lipsum}
\begin{document}
Run a command: \texttt{python3 ../install\_path/script.py -{}-arg foo -{}-another parameter {*}.txt}, then continue.
\lipsum[1][1-4]
\begin{flushleft}
Run a command: \texttt{python3 ../install\_path/script.py -{}-arg foo -{}-another parameter {*}.txt}, then continue.
\par\end{flushleft}
\end{document}
最终的布局,使用 Lorem Ipsum 显示段落宽度。请注意,--another
应该在第二行,并且没有理由不在后面换行foo
。在第 3 段的 flushleft 中,它实际上按预期工作:
理论上,可以通读文档,手动修复每一个实例,然后重做每当发生任何变化时。然而,它们有很多,我真的不想这样做。基本上,我希望所有内容\textt
都换行到空白处,而不会溢出行。我怀疑一种方法可以通过定义“局部松弛”来实现,但我不知道如何进行测试。
感谢您的时间。
我觉得我应该澄清一件事:我很清楚等宽字体中的可变空间是……不合常规的。等宽字体在这里用于视觉区分,而不是真正正确对齐。我使用列表来做到这一点,不用担心。
答案1
本地设置\spaceskip
为灵活值。等宽字体通常具有固定的字间间距,这是有原因的。但 TeX 具有内置方法,可以覆盖度量文件中的值(或在本例中为 OpenType/TrueType 字体)。
在内容前留出少量空间\hspace
有助于将一些所需的间距移出代码部分本身。
\documentclass{article}
\usepackage{fontspec}
\usepackage{microtype}
\usepackage{lipsum}
\newcommand{\inlinecode}[1]{%
\texttt{%
% set flexible interword space
\setlength{\spaceskip}{0.5em plus 1em minus 0.1em}%
% add some space with not as much flexibility, but only
% if some space precedes
\ifdim\lastskip>0pt \unskip\hspace{0.5em plus 0.5em minus 0.1em}\fi
#1
}%
}
\begin{document}
Run a command: \inlinecode{python3 ../install\_path/script.py --arg foo --another parameter *.txt}, then continue.
\lipsum[1][1-4]
\inlinecode{Some code, but no initial space}
\texttt{Some code}
\end{document}
顺便说一句,您不需要-{}-
nor {*}
。
答案2
有一个理由不在此点中断,因为这样做需要将单词间空间拉伸到超出用户可设置的限制。这是你的选择,而不是由乳胶强制的任何事情。
如果你允许单词间距进一步扩大,例如使用,\sloppy
那么它会在你想要的地方断开
请注意,这里需要拉伸的是非等宽文本中行首的单词间距。
\documentclass[english]{article}
\usepackage{fontspec}
\usepackage{microtype}
\usepackage{lipsum}
\begin{document}
{\sloppy
Run a command: \texttt{python3 ../install\_path/script.py -{}-arg foo -{}-another parameter {*}.txt}, then continue.
\lipsum[1][1-4]
}
\begin{flushleft}
Run a command: \texttt{python3 ../install\_path/script.py -{}-arg foo -{}-another parameter {*}.txt}, then continue.
\par\end{flushleft}
\end{document}
答案3
这里我tokcycle
在宏中封装了一个环境\strxtt
,它会在遇到的每个空格处添加可拉伸的粘连。理论上,你可以避免\let\texttt\strxtt
更改文档输入。
可拉伸空间仅位于\strxtt
材料内部,不会影响周围文本的间距。在这方面,它与段落级解决方案不同,例如\sloppy
。
\documentclass[english]{article}
%\usepackage{fontspec}
\usepackage{microtype}
\usepackage{lipsum}
\usepackage{tokcycle}
\xtokcycleenvironment\stretchtt
{\addcytoks{##1}}
{\processtoks{##1}}
{\addcytoks{##1}}
{\addcytoks{ \hspace{0pt plus 2ex minus 2pt}}}
{\ttfamily}
{}
\newcommand\strxtt[1]{\stretchtt#1\endstretchtt}
\begin{document}
Run a command: \strxtt{python3 ../install\_path/script.py -{}-arg foo -{}-another parameter {*}.txt}, then continue.
\lipsum[1][1-4]
\begin{flushleft}
Run a command: \texttt{python3 ../install\_path/script.py -{}-arg foo -{}-another parameter {*}.txt}, then continue.
\par\end{flushleft}
\end{document}