如何打破较长的 \texttt 部分

如何打破较长的 \texttt 部分

我经常使用 \texttt 来格式化可能很长的路径名。通常 Tex 不会破坏这些文本。该行只会产生一个水平盒溢出。它看起来像这样:

................
...C:\documents and settings
................
................
................
................
................
................
................

我如何让 Tex 创建换行符?

答案1

如果您使用的是默认的 LaTeX 字体(或少数其他字体),则可以\texttt使用该hyphenat包启用连字符:

\documentclass[twocolumn]{article}
\usepackage{lipsum}
\usepackage[htt]{hyphenat}
\begin{document}
\texttt{\lipsum[1]}
\end{document}

请注意,这仍然不能很好地格式化任意字符串,因为它将依赖于正在使用的连字符模式。

如果您的问题是关于排版路径的具体问题,另一个选择(可以说更好)是加载url包并使用其\path{...}命令:

\documentclass[twocolumn]{article}
\usepackage{url}
\begin{document}
Here is a long path: \path{/usr/local/texlive/2010/texmf-dist/tex/latex/biblatex/biblatex.sty}
\end{document}

但是,对于非 ASCII 字符,这种方法可能会有限制。如果您真的遇到困难,可以使用\newline(aka \\) 或强制结束一行\linebreak。它们在重要方面有所不同:\newline将导致段落在该点突然结束行,而\linebreak仍将尝试完全填充行以进行对齐。以下示例说明了这一点:

\documentclass[twocolumn]{article}
\begin{document}
Lorem ipsum dolor sit amet, consectetuer adipiscing elit.
Ut purus elit, vestibulum ut, placerat ac, adipiscing vitae, felis.
Curabitur dictum grav$\bullet$\newline ida mauris. 
Nam arcu libero, nonummy eget, consectetuer id, vulputate a, magna.
\bigskip

Lorem ipsum dolor sit amet, consectetuer adipiscing elit.
Ut purus elit, vestibulum ut, placerat ac, adipiscing vitae, felis.
Curabitur dictum grav$\bullet$\linebreak ida mauris. 
Nam arcu libero, nonummy eget, consectetuer id, vulputate a, magna.
\end{document}

在此处输入图片描述

答案2

打字机文本也可以进行连字和完全对齐。下面是\justify用于此目的的命令,如上例所示:

\documentclass{article}

\usepackage{lipsum}

\newcommand*\justify{%
  \fontdimen2\font=0.4em% interword space
  \fontdimen3\font=0.2em% interword stretch
  \fontdimen4\font=0.1em% interword shrink
  \fontdimen7\font=0.1em% extra space
  \hyphenchar\font=`\-% allowing hyphenation
}

\begin{document}
\texttt{\justify\lipsum[1]}
\end{document}

替代文本

此外,everysel 包可能很有用,如下所示使用打字机字体进行完全对齐

答案3

实际上,\texttt 破坏文本流,如以下测试所证明的:

\documentclass{minimal}

\usepackage{lipsum}

\begin{document}
  \lipsum[1]
  \texttt{\lipsum[1]}
\end{document}

问题是,这\texttt不会破坏文本正确地,因为显然它错误地计算了线宽。

最简单的解决方案是在适当的位置引入软连字符:

\texttt{C:\doc\-uments and set\-tings}

这将使用连字符作为可能的单词分隔符的提示,并相应地对单词进行连字符处理。如果这没有帮助,手动换行会有所帮助。

尽管不太令人满意,但另一个建议实际上是重新表述有问题的句子,以使其更加流畅。

答案4

我有一个答案,使用从这里借来的替换功能:https://tex.stackexchange.com/a/213952/78981

我有一个文档,其中所有的\texttt块都是路径 - 至少是长路径。我使用了以下内容:

\usepackage{xparse}

\ExplSyntaxOn
\NewDocumentCommand{\replace}{mmm}
 {
  \marian_replace:nnn {#1} {#2} {#3}
 }

\tl_new:N \l_marian_input_text_tl

\cs_new_protected:Npn \marian_replace:nnn #1 #2 #3
 {
  \tl_set:Nn \l_marian_input_text_tl { #1 }
  \tl_replace_all:Nnn \l_marian_input_text_tl { #2 } { #3 }
  \tl_use:N \l_marian_input_text_tl
 }
\ExplSyntaxOff

\usepackage{url}
\let\OldTexttt\texttt
\renewcommand{\texttt}[1]{\OldTexttt{\replace{#1}{/}{/\allowbreak}}}

代码让所有\texttt命令都调用上面的代码片段,将每个/命令替换为/\allowbreak,这样就可以将文本换行到下一行。这与命令非常相似\url,但我选择了这条路线,因为它与 Pandoc 配合得更好。

相关内容