![用连字符连接包含数字/数值的单词?](https://linux22.com/image/432185/%E7%94%A8%E8%BF%9E%E5%AD%97%E7%AC%A6%E8%BF%9E%E6%8E%A5%E5%8C%85%E5%90%AB%E6%95%B0%E5%AD%97%2F%E6%95%B0%E5%80%BC%E7%9A%84%E5%8D%95%E8%AF%8D%EF%BC%9F.png)
我见过强制对以数字开头的单词进行连字符连接,但我不认为那里的解决方案适用于我的情况。
因此,我使用pandoc
Markdown 编写,并通过 Latex 导出为 PDF。我有以下 Markdown 文档test.md
:
---
author: John Doe
date: \today
---
# The mimsy borogoves when outgrabeing STM32CubeProgrammer
Lorem ipsum dolor sit amet, consectetur adipiscing elit. Sed posuere mauris justo, vitae molestie tortor mollis ut. Donec nec dolor consectetur, porttitor augue et, feugiat odio. Aenean quis sem tortor. Sed finibus justo sit amet massa consectetur malesuada. Quisque enim lacus, commodo in varius a, congue id nisl. Orci varius natoque penatibus et magnis dis parturient montes, nascetur ridiculus mus. Pellentesque habitant morbi tristique senectus et netus et malesuada fames ac turpis egestas. Pellentesque auctor est vitae neque finibus dapibus. In vitae nisl in arcu fringilla faucibus non ac urna. Duis ut semper velit. Fusce turpis diam, elementum in libero fringilla, posuere sodales dolor. Quisque pellentesque, ipsum ac cursus ullamcorper, nibh nisi dictum ligula, sed pretium purus nunc eget dolor. Maecenas nec magna ullamcorper, suscipit erat et, mattis risus. Sed vehicula purus eu dictum varius.
.tex
基于此 Markdown 生成的输出稍微pandoc
复杂一些,但可以简化为这样,我们称之为test.tex
:
\documentclass[]{article}
\IfFileExists{bookmark.sty}{\usepackage{bookmark}}{\usepackage{hyperref}}
\setcounter{secnumdepth}{-\maxdimen} % remove section numbering
\author{John Doe}
\date{\today}
\begin{document}
\hypertarget{the-mimsy-borogoves-when-outgrabeing-stm32cubeprogrammer}{%
\section{The mimsy borogoves when outgrabeing
STM32CubeProgrammer}\label{the-mimsy-borogoves-when-outgrabeing-stm32cubeprogrammer}}
Lorem ipsum dolor sit amet, consectetur adipiscing elit. Sed posuere
mauris justo, vitae molestie tortor mollis ut. Donec nec dolor
consectetur, porttitor augue et, feugiat odio. Aenean quis sem tortor.
Sed finibus justo sit amet massa consectetur malesuada. Quisque enim
lacus, commodo in varius a, congue id nisl. Orci varius natoque
penatibus et magnis dis parturient montes, nascetur ridiculus mus.
Pellentesque habitant morbi tristique senectus et netus et malesuada
fames ac turpis egestas. Pellentesque auctor est vitae neque finibus
dapibus. In vitae nisl in arcu fringilla faucibus non ac urna. Duis ut
semper velit. Fusce turpis diam, elementum in libero fringilla, posuere
sodales dolor. Quisque pellentesque, ipsum ac cursus ullamcorper, nibh
nisi dictum ligula, sed pretium purus nunc eget dolor. Maecenas nec
magna ullamcorper, suscipit erat et, mattis risus. Sed vehicula purus eu
dictum varius.
\end{document}
执行的结果pdflatex test.tex
如下:
显然,“STM32CubeProgrammer”太长了,并且破坏了边距;Latex 本可以用连字符连接它,但它不知道这一点。
因此我尝试在序言中添加:
\hyphenation{STM32-Cube-Pro-gram-mer}
...但是,失败了:
! Not a letter.
l.5 \hyphenation{STM3
2-Cube-Pro-gram-mer}
?
是的,确实3
不是一封信......而且显然“\hyphenation
不接受数字(为包含数字的单词定义全局连字)”
事情是这样的:
- 由于此标题也应出现在目录中,并且位于 pandoc Markdown 中(也可能出现在其他格式中),因此我不想添加 (La)TeX 特定命令,例如
\discretionary{-)
(如括号旁边的连字符)在标题本身中
因此,对我来说最好的解决方案是全局为“STM32CubeProgrammer”定义一个连字符,然后让 LaTeX 来处理它(在标题、页眉/页脚或目录中适当时使用连字符)——但我无法使用,\hyphenation
因为它不解析数字。
所以,我的问题是 - 我还能在 Latex 序言中做些什么,以便 Latex 将“STM32CubeProgrammer”视为可连字符的单词?我想,如果数字“破坏”连字符搜索,Latex 可能会将 32 之后的部分视为用于连字符的新单词输入,所以我尝试了\hyphenation{Cube-Pro-gram-mer}
,但没有效果。
也许可以做些什么,通过临时更改 3 和 2 的 catcode,这样就可以\hyphenation
通过了?不幸的是,我对 Latex 和 catcode 的内部结构了解不够,无法自己解决这个问题……
答案1
\documentclass{article}
\lccode`\2`\2
\lccode`\3`\3
\hyphenation{STM-32-Cube-Pro-gram-mer}
\setlength\textwidth{1mm} % just for this example
\begin{document}
. STM32CubeProgrammer% start with some character b/c pdflatex doesn't hyphenate the first word of a paragraph
\end{document}
至于意外的副作用,根据引用的答案进行调整:
“是的,他们为连字算法制作了 2 个和 3 个字母,因此 foobar23 将被查找为 8 个字母的单词 foobar23,而不是 6 个字母的单词 foobar,这会影响整个连字。但如果您将其限制在仅包含技术构造的区域,则可能没问题,因为自然语言连字模式并不总是适合那里。”
答案2
您可以添加\-
但通常最好将章节标题设置得参差不齐,这样就不需要连字符了。
首先,使用
\section{The mimsy borogoves when outgrabeing
STM32\-CubeProgrammer}\label{the-mimsy-borogoves-when-outgrabeing-stm32cubeprogrammer}}
如果你想要在 markdown 中不使用 tex 语法来生成此输出,\-
那么可以使用 Unicpde spft 连字符 U+00AD LaTeX 会将其视为\-
\section{The mimsy borogoves when outgrabeing
STM32CubeProgrammer}\label{the-mimsy-borogoves-when-outgrabeing-stm32cubeprogrammer}}
你在这里看不到,但是 2 和 C 之间有一个软连字符
第二次添加
\makeatletter
\renewcommand\section{\@startsection {section}{1}{\z@}%
{-3.5ex \@plus -1ex \@minus -.2ex}%
{2.3ex \@plus.2ex}%
{\normalfont\Large\bfseries\raggedright}}
\makeatother
回到序言。