我希望 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}