![使用 \newcommand 创建的文本溢出到边距(不是 xspace 问题)](https://linux22.com/image/252791/%E4%BD%BF%E7%94%A8%20%5Cnewcommand%20%E5%88%9B%E5%BB%BA%E7%9A%84%E6%96%87%E6%9C%AC%E6%BA%A2%E5%87%BA%E5%88%B0%E8%BE%B9%E8%B7%9D%EF%BC%88%E4%B8%8D%E6%98%AF%20xspace%20%E9%97%AE%E9%A2%98%EF%BC%89.png)
我知道xspace
在不同情况下使用 来处理宏后的空格。但是,似乎我无法避免使用 创建的文本超出\newcommand
边距。
似乎在换行时会忽略扩展文本的长度。有简单的解决方法吗?
这是最小的示例乳胶代码。
\documentclass[11pt]{article}
\usepackage{xspace}
\newcommand{\DirectTransformation{\ensuremath{\mathtt{DirectTransformation}}\xspace}
\begin{document}
In the following carefully crafted sentence, the macro will overflow
\DirectTransformation into the margin. Subsequent sentences show
where the margin of the document actually ends and that the first
sentence always overflows. Is there a solution to this problem?
\end{document}
这使
答案1
两种可能的选择。首先,使用\texttt{}
并添加一个或多个自由连字符。例如:
\renewcommand{\DirectTransformation}{\texttt{Direct\-Transformation}}
或者,有点像其他答案,您可以尝试在序言中将“紧急拉伸”更改为给定量:
\emergencystretch=1em
但这是一个“全局”解决方案,只有当包含不可拆分但较长单词的段落过多时才应考虑使用。否则,正如@JLDiaz 所建议的那样,这\sloppy
可能是更好的选择。
(此外,您的示例中宏名称缺少右括号。但显然,如果更改内容少于 6 个字符或更多,我就无法编辑问题。)
答案2
数学有自己的换行规则。数学模式中的换行通常发生在关系符号处。无论如何,TeX 永远不会断开或用连字符连接变量名,这就是DirectTransformation
TeX 的本质。
面对那个“不可分割”的单词,TeX 必须在将单词留在行末或在该单词之前分割行之间做出选择。第一种情况是不可取的,因此 TeX 会给它分配一定程度的“丑陋”。第二种情况需要在单词之间插入额外的空格,以便完全对齐行。这个额外的空间也被认为是丑陋的,所以这个决定会增加段落的丑陋程度。TeX 尝试了几种将段落分成行的替代方案,并选择了“丑陋程度”最小的方案。
TeX 用来分配每个替代方案的丑陋值的默认参数被设计成优先于第一种情况(单词超出右边距),而不是第二种情况(单词之间有太多空格,也称为满箱)。
这与单词不可分解无关,\newcommand
而是与该单词不可分解有关。如果将该单词放入 中,也可以得到相同的结果\mbox
。例如:
In the following carefully crafted sentence, the macro will overflow
\mbox{DirectTransformation} into the margin. Subsequent sentences show
where the margin of the document actually ends and that the first
sentence always overflows. Is there a solution to this problem?
生成:
TeX 的默认参数可以调整。一个温和的调整是将命令放在\sloppy
序言中。这会改变参数,使 TeX 对未满行更具容忍度。在您的示例中使用这将导致:
比较这两个输出,很难相信 TeX “认为”第一个比第二个更不丑,但这就是 TeX 看待美的方式。
与其调整 TeX 的默认参数,不如尝试重新措辞段落,让冲突的单词不会出现在行末,这通常是一个更好的主意。当然,这是一种微调,只有在编辑的最后阶段才有意义。