我试图避免在奇数页上使用连字符,并且我想手动进行连字符操作:禁止对某些单词使用连字符。
当我将带连字符的单词包含在内时\hbox
,重新编译后其他一些相邻的单词也会被连字符,因此我需要重新运行编译器几次。
\hyphenpenalty
和其他惩罚对整个段落都有效,但我只想禁止断开几个相邻的单词。
我知道我可以接受每一个字\hbox
,但还有其他选择吗?
答案1
\mbox
您可以自动用空格分隔每个实体。我定义了一个宏\nohyphen
来实现这一点。
\nohyphen{list of words} -> \mbox{list} \mbox{of} \mbox{words}
这也意味着,为了保护空格,您必须将相关条目括在括号中,如{$a = b$}
。否则,这也会在空格处被拆分,从而导致混乱。
\documentclass{article}
\usepackage{xparse}
\ExplSyntaxOn
\seq_new:N \l_pantlmn_words_seq
\cs_new_protected:Npn \pantlmn_nohyphens:n #1
{
\seq_set_split:Nnn \l_pantlmn_words_seq { ~ } { #1 }
\seq_map_inline:Nn \l_pantlmn_words_seq
{ \mbox { ##1 } ~ }
\tex_unskip:D
}
\NewDocumentCommand \nohyphen { m }
{
\pantlmn_nohyphens:n { #1 }
}
\ExplSyntaxOff
\begin{document}
\fbox{%
\parbox{2em}{%
overly longish dictionary words {$a = b$}
}%
}
\quad
\fbox{%
\parbox{2em}{%
\nohyphen{overly longish dictionary words {$a = b$}}
}%
}
\end{document}
选择
您还可以将单词添加到列表中,这些单词在括在 中时不应使用连字符\nohyphen
。我借用了 Mico 的答案中的示例单词。您可以通过 向逗号分隔的列表中添加单词\addnohyphen
。这样,您就不需要将公式括在括号中。另一方面,这种解决方案仅在您只想抑制几个单词的连字符时才实用。
前导x
只是为了允许连字符useful
,因为 TeX 禁止对段落的第一个单词进行连字符。
\documentclass{article}
\usepackage{xparse}
\ExplSyntaxOn
\seq_new:N \l_pantlmn_words_seq
\tl_new:N \l_pantlmn_nohyphen_tl
\cs_new_protected:Npn \pantlmn_nohyphens:n #1
{
\seq_set_split:Nnn \l_pantlmn_words_seq { ~ } { #1 }
\seq_map_inline:Nn \l_pantlmn_words_seq
{
\str_case:nVTF { ##1 } \l_pantlmn_nohyphen_tl
{ \mbox { ##1 } ~ }
{ ##1 ~ }
}
\tex_unskip:D
}
\cs_new_protected:Npn \pantlmn_add_nohyphen:n #1
{
\clist_map_inline:nn { #1 }
{
\tl_gput_right:Nn \l_pantlmn_nohyphen_tl { { ##1 } { } }
}
}
\NewDocumentCommand \nohyphen { m }
{
\pantlmn_nohyphens:n { #1 }
}
\NewDocumentCommand \addnohyphen { m }
{
\pantlmn_add_nohyphen:n { #1 }
}
\ExplSyntaxOff
\begin{document}
\addnohyphen{useful,handful}
\fbox{%
\parbox{1em}{%
x useful handful helpful {$a = b$}
}%
}
\quad
\fbox{%
\parbox{1em}{%
x \nohyphen{useful handful helpful $a = b$}
}%
}
\end{document}
答案2
这是一个基于 LuaLaTeX 的解决方案。它由 (i) 一个 Lua 函数组成,该函数将其参数中的每个单词封装在一个\mbox{...}
“包装器”中,使其无法连字符,同时仍允许换行之间\nohyph
单词,以及 (ii)调用 Lua 函数的LaTeX 宏。争论LaTeX 宏应该是连续的单词串,不能用连字符连接。
% !TEX TS-program = lualatex
\documentclass{article}
\usepackage{luacode}
\begin{luacode}
function nohyph ( x )
x = string.gsub ( x , "%a+", "\\mbox{%0}" )
return ( tex.sprint (x) )
end
\end{luacode}
\newcommand\nohyph[1]{\directlua{nohyph(\luastring{#1})}}
\usepackage[textwidth=1mm]{geometry} % set an extremely narrow measure
\setlength\parindent{0pt}
\begin{document}
useful handful helpful
---
\nohyph{useful handful helpful}
\end{document}