选择

选择

我试图避免在奇数页上使用连字符,并且我想手动进行连字符操作:禁止对某些单词使用连字符。

当我将带连字符的单词包含在内时\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}

相关内容