我正在排版一本 DIN A5 格式的书,在“I”字符后产生了很多换行符,看起来不太美观。~
在我的条件下,在后面插入换行符会引入更多 badbox(microtype
已用于突出和扩展)。
有没有办法告诉 LaTeX(我正在用 进行编译pdftex
)在“I”之后中断是不好的,因此不鼓励这样做,但如果否则会引入 badbox,仍然会让它中断?
梅威瑟:
\documentclass[a5paper,10pt]{article}
\usepackage[left=18mm,right=25mm,top=18mm,bottom=25mm]{geometry}
\usepackage[bitstream-charter]{mathdesign}
\usepackage[protrusion=true,expansion=true,stretch=20,shrink=20]{microtype}
\newcommand\sentence{This is the first long long sentence with interword spaces. I am broken off from the rest.}
\begin{document}
\pagestyle{empty}
\rule{4mm}{.5pt}\sentence\\
\rule{8mm}{.5pt}\sentence\\
\rule{12mm}{.5pt}\sentence\\
\rule{16mm}{.5pt}\sentence\\
\rule{20mm}{.5pt}\sentence\\
\rule{24mm}{.5pt}\sentence\\
\end{document}
答案1
您可以使用
I\nolinebreak[2] said this
为了阻止此时换行(或[1]
或[3]
),使用基本上与在此上下文中[4]
使用相同。~
您可以定义如下命令
\newcommand\I{I\nolinebreak[2]}
然后使用\I{}
而不是I
但你需要这样{}
才能看到以下空间除非你使用非字母如\1
或者你可以使用xspace
但我不建议这么做
正如评论中指出的那样,还有一些关于\nolinebreak
正如评论中指出的那样,这个答案中
\nobreak 和 \nolinebreak 之间有什么区别?
答案2
正如 David 所展示的,尽管更强烈或更不强烈\nolinebreak
地阻止“I”之后的中断,但正如您所要求的,即使使用您的microtype
设置,有时此命令只能被忽略或产生一些过满的\hbox
,当这等同于时~
。
然后,一种将两个单词连在一起而不造成 的变通方法overfull \hbox
是在每行的空格中添加一些额外的可伸缩性,以便\emergencystretch
或I\nolinebreak[4] xxx
或\mbox{I xxx}
可以I~xxx
只以一些额外的单词间距为代价跳到下一行。但我不决定这是否比在“I ”之后休息更好。
例子:
\documentclass[draft]{article}
\usepackage[protrusion=true,expansion=true,stretch=20,shrink=20]{microtype}
\usepackage[rmargin=2in,showframe,paperwidth=4in]{geometry}
% rest of preamble just to format the example
\usepackage[svgnames]{xcolor}
\usepackage[obeyspaces]{url}
\makeatletter
\def\Gm@hrule{}%
\def\Gm@vrule{\color{olive!50}\vrule width .4pt height\textheight depth\z@}%
\def\Gm@hruled{}%
\makeatother
\parskip0em\parindent0pt
\def\opt#1{\medskip{\color{orange}\scriptsize\url{#1}\par}}
\begin{document}
\fontsize{10}{8}\selectfont %just to format the example
\opt{plain text}
This is a text where I express myself.
% non-working option, but typographicaly correct
\opt{\nolinebreak[1-3]}
This is a text where I\nolinebreak[3] express myself.
% non-working option, giving a overfull \hbox
\color{red!40!black}
\opt{\nolinebreak[4]}
This is a text where I\nolinebreak[4] express myself.
\opt{non-break space (~)}
This is a text where I~express myself.
\opt{\mbox{I express}}
This is a text where \mbox{I express} myself.
% working options
\color{Navy}
\opt{\emergencystretch plus ...}
\opt{+ \nolinebreak[4]}
\emergencystretch.5em
This is a text where I\nolinebreak[4] express myself.
\opt{+ non-break space}
This is a text where I~express myself.
\opt{+ \mbox{}}
This is a text where \mbox{I express} myself.
\end{document}
答案3
这chickenize
软件包提供了一个命令,该命令将通过使用 Lua 后端插入惩罚来抑制单字母单词后的换行符。使用 LuaLaTeX 进行编译。
\documentclass[a5paper,10pt]{article}
\usepackage[left=18mm,right=25mm,top=18mm,bottom=25mm]{geometry}
\usepackage[bitstream-charter]{mathdesign}
\usepackage[protrusion=true,expansion=true,stretch=20,shrink=20]{microtype}
\usepackage{chickenize}
\suppressonecharbreak
\newcommand\sentence{This is the first long long sentence with interword spaces. I am broken off from the rest.}
\begin{document}
\pagestyle{empty}
\rule{4mm}{.5pt}\sentence\\
\rule{8mm}{.5pt}\sentence\\
\rule{12mm}{.5pt}\sentence\\
\rule{16mm}{.5pt}\sentence\\
\rule{20mm}{.5pt}\sentence\\
\rule{24mm}{.5pt}\sentence\\
\end{document}