\texttt 和断句

\texttt 和断句

当在宽度可变的对齐段落中使用等宽段时,等宽部分通常会“晚一个字”换行,从而导致许多行超出水平盒子的范围。

已经有几个关于文本断行的问题了\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 中,它实际上按预期工作: LuaLaTeX 输出

理论上,可以通读文档,手动修复每一个实例,然后重做每当发生任何变化时。然而,它们有很多,我真的不想这样做。基本上,我希望所有内容\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}

在此处输入图片描述

相关内容