文本中的换行符

文本中的换行符

我希望 latex 能够拆分其中\texttt{}不包含空格的长文本。目前文本刚好超出页面范围。

latex 文档是从 reStructureText 文档生成的(我必须使用 reStructuredText)。因此,我宁愿不使用这些解决方案:

  • 替换\texttt{}\path{}\url{}(除非有人可以告诉我如何让 Docutils 做到这一点)
  • 插入\allowbreak{}/ 软连字符(可行,但会破坏 reStructuredText 文档的可读性)

latex 文档中是否存在一些全局配置,会导致 texttt 字符串中断? 还有其他好方法可以获取显示所有文本的可打印文档吗?

这是我的问题的一个最小例子:

\documentclass[a4paper]{article}
\begin{document}
If an unrecoverable error occurs during the transformation, then a
\texttt{javax.xml.transform.TransformerException} is thrown.
\end{document}

当我尝试创建一个 pdf(使用“pdflatex a.tex”)时,只有“TranformerEx”和“TranformerException”可见。

答案1

窃取 egreg 的答案如何在不使用 url 包的情况下模拟 \url 连字?,其中他重新定义了\url,我从相同的重新定义开始,\texttt而不是重新定义\url。在 egreg 的原始版本中,它允许在./字符处换行。

但其他的断点符号也可以添加,比如下面我也做[一个断点:

\documentclass[a4paper]{article}
\renewcommand{\texttt}[1]{%
  \begingroup
  \ttfamily
  \begingroup\lccode`~=`/\lowercase{\endgroup\def~}{/\discretionary{}{}{}}%
  \begingroup\lccode`~=`[\lowercase{\endgroup\def~}{[\discretionary{}{}{}}%
  \begingroup\lccode`~=`.\lowercase{\endgroup\def~}{.\discretionary{}{}{}}%
  \catcode`/=\active\catcode`[=\active\catcode`.=\active
  \scantokens{#1\noexpand}%
  \endgroup
}
\usepackage{lipsum}
\begin{document}
\lipsum[4]
If an unrecoverable error occurs during the transformation, then a
\texttt{javax.xml.transform.TransformerException} is thrown.

If an unrecoverable error occurs during the transformation, then a
\texttt{\$GLOBALS['TCA']['tt\_address']['feInterface']['fe\_admin\_fieldList']}
\end{document}

在此处输入图片描述

如果您需要在章节或其他标题中使用此解决方案,或者在写入 .aux 文件和从 .aux 文件读回的其他地方使用此解决方案,则需要替换\renewcommand-\DeclareRobustCommand请参阅此答案以获取更多信息:将 \texttt{} 与章节和目录结合起来 - 不正确的字母常数


补充

Lemdan 在评论中问(Joey 很久以前也问过)如何才能使下划线成为_断点?因为下划线通常是 catcode 8,所以必须吸收参数,\texttt而不是使用设置为 12 的 catcode。_当然,这将阻止在 中的数学中使用下标\texttt,但这应该不会太难接受。这还将消除在 中转义下划线的需要\texttt

\documentclass[a4paper]{article}

\catcode`_=12 %
\renewcommand{\texttt}[1]{%
  \begingroup
  \ttfamily
  \begingroup\lccode`~=`/\lowercase{\endgroup\def~}{/\discretionary{}{}{}}%
  \begingroup\lccode`~=`[\lowercase{\endgroup\def~}{[\discretionary{}{}{}}%
  \begingroup\lccode`~=`.\lowercase{\endgroup\def~}{.\discretionary{}{}{}}%
  \begingroup\lccode`~=`_\lowercase{\endgroup\def~}{_\discretionary{}{}{}}%
  \catcode`/=\active\catcode`[=\active\catcode`.=\active\catcode`_=\active
  \scantokens{#1\noexpand}%
  \endgroup
}
\catcode`_=8 % 

\usepackage{lipsum}
\begin{document}
\lipsum[4]
If an unrecoverable error occurs during the transformation, then a
\texttt{javax.xml.transform.TransformerException} is thrown.

If an unrecoverable error occurs during the transformation, then a
\texttt{\$GLOBALS_'TCA']['tt_address']['feInterface']['fe_admin_fieldList']}
\end{document}

在此处输入图片描述

答案2

根据史蒂文的回答,在我的文档中,我使用\texttt图形来显示路径和 URL,而且在文本中使用它\texttt来突出显示小段代码。

\texttt虽然 Steven 提供的代码适用于我的图表,但在为不使用符号的普通文本编写命令时,它仍然会溢出边距。如下图所示,\texttt它适用于图表,但适用于普通文本,效果不佳。

在此处输入图片描述

为了解决这个问题,我借用了\justify 摘自这篇 tex.se 文章并将其添加到现有代码中。

\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
}

\renewcommand{\texttt}[1]{%
  \begingroup
  \ttfamily
  \begingroup\lccode`~=`/\lowercase{\endgroup\def~}{/\discretionary{}{}{}}%
  \begingroup\lccode`~=`[\lowercase{\endgroup\def~}{[\discretionary{}{}{}}%
  \begingroup\lccode`~=`.\lowercase{\endgroup\def~}{.\discretionary{}{}{}}%
  \catcode`/=\active\catcode`[=\active\catcode`.=\active
  \justify\scantokens{#1\noexpand}%
  \endgroup
}

这会产生更好的输出,并且适用于我在不同地方使用打字机的情况。

在此处输入图片描述

答案3

我不确定你愿意从序言中做多少,但这里有一个建议:

\documentclass{article}

\begingroup
  \catcode`\.=\active
  \gdef.{\normalperiod\allowbreak}%
\endgroup

\newcommand\aepath[1]{%%
  \bgroup 
    \let\normalperiod=.%%
    \catcode`\.=\active
    \everyeof{\noexpand}%%
    \endlinechar=-1%%
    \ttfamily\scantokens{#1}%%
  \egroup}

\let\oldtexttt\texttt
\let\texttt\aepath

\begin{document}

If an unrecoverable error occurs during the transformation, then a
\texttt{javax.xml.transform.TransformerException} is thrown.

\end{document}

从您的 MWE 来看,我假设您希望您的代码在出现 a 的位置可中断.。假设您可能遇到较长文本的所有情况都涉及此类.分隔名称,并且您不需要将其\texttt用于文档中的任何其他目的,那么这可能是您的解决方案。

如果您担心另一个包可能需要.激活但定义不同,您可以采取以下方法:

\documentclass{article}

\begingroup
  \catcode`\.=\active
  \gdef\redefineperiod{\def.{\normalperiod\allowbreak}}%%
\endgroup

\newcommand\aepath[1]{%%
  \bgroup 
    \let\normalperiod=.%%
    \catcode`\.=\active
    \redefineperiod
    \everyeof{\noexpand}%%
    \endlinechar=-1%%
    \ttfamily\scantokens{#1}%%
  \egroup}

\let\oldtexttt\texttt
\let\texttt\aepath

\begin{document}

If an unrecoverable error occurs during the transformation, then a
\texttt{javax.xml.transform.TransformerException} is thrown.  Followed
by more text which is just to fill to the ned of the line.

\end{document}

天真地(即:这是我最初认为我可以做的),你可以尝试

\documentclass{article}

\newcommand\aepath[1]{%%
  \bgroup 
    \let\normalperiod=.%%
    \catcode`\.=\active
    \def.{\normalperiod\allowbreak}%%
    \everyeof{\noexpand}%%
    \endlinechar=-1%%
    \ttfamily\scantokens{#1}%%
  \egroup}

\let\oldtexttt\texttt
\let\texttt\aepath

\begin{document}

If an unrecoverable error occurs during the transformation, then a
\texttt{javax.xml.transform.TransformerException} is thrown.  Followed
by more text which is just to fill to the ned of the line.

\end{document}

但这会失败,因为后面的句号\def已经被标记化并且处于非活动状态。因此,LaTeX 将抛出有关缺少控制序列的错误。

更新

如果你不是特别关心中断发生的位置,那么你可以使用类似以下的方法:

\documentclass{article}

\makeatletter
\newcommand\aepath[1]{%%
  \bgroup
    \ttfamily
    \ae@path#1\relax\@nil
  \egroup}
\def\ae@path#1#2\@nil{%%
  \def\ae@continue{}%%
  \detokenize{#1}\unskip\penalty\z@  
  \ifx\relax#2%%
  \else 
    \def\ae@continue{\ae@path#2\@nil}%%
  \fi
  \ae@continue}
\makeatother

\let\texttt\aepath

\begin{document}

If an unrecoverable error occurs during the transformation, then a
\texttt{javax.xml.transform.TransformerException} is thrown.

\end{document}

虽然这对我来说似乎有点不太理想。我认为最好决定断点应该在哪里,并按照示例.将这些字符(例如/-等)变成命令上下文中的活动字符,并偷偷带入惩罚以允许在它们之后进行中断。

答案4

这是一个迟来的回复,但我发布了一个问题并给出了答案这里,这里再次逐字逐句地重复一遍:

使用 \seqsplit。

\documentclass[9pt,oneside]{amsart}

\usepackage{seqsplit}

\begin{document}

Filler text. Filler text. Filler text. Filler text. \seqsplit{0xcf416c536ec1a19ed1fb89e4ec7ffb3cf73aa413b3aa9b77d60e4fd81a4296ba}

\end{document}

使用 seqsplit 来分割长文本。

相关内容