ChatGPT解决这个技术问题 Extra ChatGPT

如何让 LaTeX 连字符包含破折号的单词?

在我正在编写的 LaTeX 文档中,由于“多学科”一词恰好出现在一行的末尾,我收到了一个过满的 hbox 警告。

我可以通过将它更改为 multi-discipli\-nary 来摆脱这个特殊的警告,但同样的问题也会发生在其他地方,因为这个词在论文中被大量使用。

我想改用 \hyphenation{} 命令,但显然我试探性的 \hyphenation{multi-disci-pli-na-ry} 不起作用,因为它不能正确理解第一个破折号。

我需要什么咒语才能在已经包含破折号的单词中获得正确的缩进?

奖励问题:我自己在哪里可以找到该问题的答案?

为什么在硬炒作时单词被打破是个问题? “多\换行维度”不行吗?
奖励答案:“latex hyphenation”的谷歌搜索产生了各种有用的结果,包括有答案的乳胶 wiki 书:en.wikibooks.org/wiki/LaTeX/Formatting#Hyphenation
@mica:不,不是。几年前我已经阅读了所有这些页面。 @geoff:确实,如果乳胶在那里使用连字符就可以了。但在本例中,它会导致“hbox 不足”,并且 Latex 选择根本不使用连字符。
这个问题似乎是题外话,因为它是关于 Latex 的,应该迁移到 tex.stackexchange.com
感谢您的评论@DrewSteen。显然我同意。但是在我的辩护中,当我问这个问题时,并没有 tex.SX 这样的东西:-)

P
Peter Mortensen

问题(正如 KennyTM 所指出的)是 LaTeX 不会用破折号连字符连接单词。幸运的是,有一个标准包(ncctools 的一部分)可以解决这个问题,称为 extdash。这定义了新的连字符和破折号命令,它们不会中断连字符,并且可以允许或防止在连字符/破折号处换行。我更喜欢将它与 shortcuts 选项一起使用,因此我可以使用 \-/ 而不是 \Hyphdash。这就是你想要的:

\usepackage[shortcuts]{extdash} ... multi\-/disciplinary

为防止在该连字符处中断,请使用 multi\=/disciplinary

(除此之外:The Chicago Manual of Style 建议删除附加诸如“multi”之类的词缀的连字符,除非这个词没有它就模棱两可或难以理解。)


这很好,但是当我在章节字符串中使用它时会产生超引用警告:Package hyperref Warning: Token not allowed in a PDF string。在那里,另一个建议的解决方案 (\def\hyph{-\penalty0\hskip0pt\relax}) 有效。
@Jan-PhilipGehrcke:这些警告也可以使用 \texorpdfstring 修复(它为进入章节标题的字符串提供条件编译)。我将使用隐藏在语义宏中(这里可能是 \multidisciplinary)。是的,它并不完美。
0
0xC0000022L

https://texfaq.org/FAQ-nohyph

TeX 不会对已经连字符的单词进行连字符。例如,(漫画)英文姓氏 Smyth-Postlethwaite 不会连字符,这可能很麻烦。这是正确的英文排版样式(其他语言可能不正确),但如果需要,您可以将名称中的连字符替换为 \hyph 命令,定义为 \def\hyph{-\penalty0\hskip0pt\relax}这不是本常见问题解答通常会推荐的那种东西…… hyphenat 包定义了一组这样的命令(用于在各种标点符号处引入连字符点)。

或者您可以 \newcommand 扩展为 multi-discipli\-nary 的命令(使用搜索 + 全部替换来替换现有单词)。


非常感谢。正如我所怀疑的,没有“完美”的答案。因为我不是该文档中的唯一作者,所以我真的不想强迫其他人在任何地方都使用 \newcommand(这就是我寻找基于 \hyphenation 的东西的原因)。我想我会默认保持“原样”,并在 Latex 抱怨 hbox 过满时手动添加显式连字符。
Z
Zouppen

我使用包 hyphenat,然后将复合词如芬兰词 Internet-yhteys(英语。Internet 连接)写为 Internet\hyp yhteys。看起来很傻,但似乎是我发现的最优雅的方式。


r
rudolfbyker

如 kennytm 所述,multi-disciplinary 不会被连字符。但是 multi-\-disciplinary 具有与 multidisciplinary 相同的断字机会。

我承认我不知道为什么会这样。它不同于描述的行为 here(强调我的):

命令 \- 在单词中插入任意连字符。这也成为该单词中允许连字的唯一点。


- 替换为 -\- 不会改变输出,至少使用 overleaf.com 中的默认设置(可能是 pdflatex,但 overleaf 实际上并没有说明)。
M
Mat
multi\hskip0pt-\hskip0pt disciplinary

例如,您可以定义为

\def\:{\hskip0pt}

然后写

multi\:-\:disciplinary

请注意,babel 俄语语言包有自己的一组破折号,它们不禁止连字符,例如 "~(双引号+波浪号)。


应该是 multi-\hskip0pt disciplinary。就像你的 MWE 一样,它会过度宣传。只需设置 \setlength{\textwidth}{0.1cm} 即可尝试。
J
JanKanis

我有同样的问题。我使用 hyphenat 加上以下宏:

\RequirePackage{hyphenat}
\RequirePackage{expl3}


% The following defs make sure words that contain an explicit `-` (hyphen) are still hyphenated the normal way, and double- and triple hyphens keep working the way they should. Just don't use a `-` as the last token of your document. Also note that `-` is now a macro that is not fully expandable

\ExplSyntaxOn

% latex2e doesn't like commands starting with 'end', apparently expl3 doesn't have any problems with it
\cs_new:Npn \hyphenfix_emdash:c {---}
\cs_new:Npn \hyphenfix_endash:c {--}

\cs_new:Npn \hyphenfix_discardnext:NN #1#2{#1}


\catcode`\-=\active

\cs_new_protected:Npn -{
    \futurelet\hyphenfix_nexttok\hyphenfix_i:w
}

\cs_new:Npn \hyphenfix_i:w {
    \cs_if_eq:NNTF{\hyphenfix_nexttok}{-}{
        %discard the next `-` token
        \hyphenfix_discardnext:NN{\futurelet\hyphenfix_nexttok\hyphenfix_ii:w}
    }{
        % from package hyphenat
        \hyp
    }
}

\cs_new:Npn \hyphenfix_ii:w {
    \cs_if_eq:NNTF{\hyphenfix_nexttok}{-}{
        \hyphenfix_discardnext:NN{\hyphenfix_emdash:c}
    }{
        \hyphenfix_endash:c
    }
}


\ExplSyntaxOff

请注意,这使用了来自 latex3 的 expl3 包。

它使 - 成为向前扫描的活动字符,以查看其后是否有更多破折号。如果是这样,它保持为 -,以确保 ----- 继续工作。如果不是,它将成为 hyphenat 中的 \hyp 命令,在单词的其余部分启用分词。这是一个通用的解决方案,它使所有包含显式连字符的单词正常连字符。

请注意,- 成为不可完全扩展的宏,因此请在加载可能不希望 - 成为宏的其他包后尝试包含此宏

编辑:这是我的第二个版本,当 {} 后跟连字符时,第一个版本的健壮性较差。这个不是,但与第一个版本不同的是,此版本中的 - 不是完全可扩展的。

编辑 2:我用于解决此问题的模块最终成长为以下内容。由于我不再使用 Latex,而且我在 10 多年前写了这篇文章,所以我不知道以下内容是否仍然有效。买者自负!

\RequirePackage{hyphenat}
\RequirePackage{expl3}


% The following defs make sure words that contain an explicit `-` (hyphen) are still hyphenated the normal way, and double- and triple hyphens keep working the way they should. Just don't use a `-` as the last token of your document. Also note that `-` is now a macro that is not fully expandable

% The original hyphen is available as the \hp command.

\ExplSyntaxOn

\cs_new:Npn \hp {-}

% make hyphen the normal character
\cs_new:Npn \hyphenfixdisabled {
  \catcode`\-=12\relax
}


\cs_new:Npn \hyphenfix_emdash:c {---}
\cs_new:Npn \hyphenfix_endash:c {--}

\cs_new:Npn \hyphenfix_discardnext:NN #1#2{#1}

\cs_new:Npn \hyphenfix_ignore:c {-}


\catcode`\-=\active


%Making hyphen an active character throughout a document can lead to unexpected errors, especially if it is being edited by multiple persons. This note command at the beginning of what will be the meaning of `-' will hopefully help diagnose errors resulting from hyphen behaving unexpectedly.
\catcode`\!=11
\catcode`\.=11

\let \Note:hyphen_is_an_active_character!_see_hyphenfix.tex! \relax

\cs_new_protected:Npn \hyphenfix_fixhyphen:w{
    \if_mode_math:
        \hp
    \else: \use_i_after_fi:nw {
        \Note:hyphen_is_an_active_character!_see_hyphenfix.tex!
        \futurelet\hyphenfix_nexttok\hyphenfix_i:w
        }
    \fi:
}
\catcode`\!=12
\catcode`\.=12

\cs_new:Npn \hyphenfix_i:w {
    \cs_if_eq:NNTF{\hyphenfix_nexttok}{-}{
        %discard the next `-` token
        \hyphenfix_discardnext:NN{\futurelet\hyphenfix_nexttok\hyphenfix_ii:w}
    }{
        % from package hyphenat
        \hyp
    }
}

\cs_new:Npn \hyphenfix_ii:w {
    \cs_if_eq:NNTF{\hyphenfix_nexttok}{-}{
        \hyphenfix_discardnext:NN{\hyphenfix_emdash:c}
    }{
        \hyphenfix_endash:c
    }
}

\cs_new:Npn \hyphenfixenable {
  \catcode`\-=\active
  \let-\hyphenfix_fixhyphen:w
}
\cs_new:Npn \hyphenfixdisable {
  \let-\hyphenfix_ignore:c
  \catcode`\-=12\relax
}

\catcode`\-=12\relax

\ExplSyntaxOff

抱歉,宏 /futurelet 上似乎出现了一些错误
@PeterlitsZo 抱歉,此代码来自 10 多年前。我已经很久没有使用 LaTeX 了,所以到现在为止,这段代码对我来说几乎是难以理解的。当时它曾经对我有用。我附上了我的代码成长为的最后一个版本,也许这会有所帮助。
T
Ton Smeele

由于 Latex 认为多学科是具有首选连字符的单个词,因此您可以指出这是两个单独的词,例如:multi-\hspace{0pt}学科就足以解决这个问题。


这不是与 stackoverflow.com/a/8075536/2777074 基本相同吗?
C
Community

我在这里回答了类似的问题:LaTeX breaking up too many words

我说:

您应该在序言中的某处设置断字惩罚:

\hyphenpenalty=750

750 的值适合我在信纸(8.5x11 英寸)上使用 12 pt 字体进行两列布局的需要。调整值以满足您的需要。数字越大,出现的断字越少。您可能还想看看 hyphenatpackage,它提供的不仅仅是断字惩罚


他问的是如何避免断字,而不是如何定义限制。
I
Igor

为了避免在已经连字符的单词中出现连字符,我将不间断空格 ~ 与向后空格 \! 结合使用。例如,命令

3~\!\!\!\!-~\!\!\!D

在文本中使用,抑制单词 3-D 中的断字。可能不是最好的解决方案,但它对我有用!


这是回答所问内容的相反问题。此外,正如试图编辑您的帖子以指出这一点的人所说,有一种更好的方法来做您所做的事情:\mbox{3-D}

关注公众号,不定期副业成功案例分享
关注公众号

不定期副业成功案例分享

领先一步获取最新的外包任务吗?

立即订阅