![如何创建平衡且右边不规则的标题线?](https://linux22.com/image/471945/%E5%A6%82%E4%BD%95%E5%88%9B%E5%BB%BA%E5%B9%B3%E8%A1%A1%E4%B8%94%E5%8F%B3%E8%BE%B9%E4%B8%8D%E8%A7%84%E5%88%99%E7%9A%84%E6%A0%87%E9%A2%98%E7%BA%BF%EF%BC%9F.png)
我有一些部分标题(在所有标题级别),它们设置为不对齐且不带连字符。但是行分布不均衡,因此当标题很长时,您可能会发现,比如说,下一行中有一个单词被孤立。
我想要的效果类似于CSStext-wrap: balance
。
我可以使用ragged2e
及其\Centering
命令获得良好的生产线平衡,但由于我无法理解的原因,该\RaggedRight
命令无法获得相同的结果。
总之我想要:
- 标题不齐
- 没有连字符
- 标题换行时平衡行
解决方案需要在序言中处理,因为文本是从 HTML 自动转换的,所以我无法插入换行符。
梅威瑟:
\documentclass[a4paper]{article}
\usepackage{ragged2e}
\begin{document}
{\tiny normal centering}\\
\parbox{\textwidth}{\section*{\centering This is some random text to test ragged line balance}}
\vspace{3em}
{\tiny ragged2e Centering}\\
\parbox{\textwidth}{\section*{\Centering This is some random text to test ragged line balance}}
\vspace{3em}
{\tiny normal raggedright}\\
\parbox{\textwidth}{\section*{\raggedright This is some random text to test ragged line balance}}
\vspace{3em}
{\tiny ragged2e RaggedRight}\\
\parbox{\textwidth}{\section*{\RaggedRight This is some random text to test ragged line balance}}
\vspace{3em}
{\tiny this is what I want}\\
\parbox{\textwidth}{\section*{\RaggedRight This is some random text \\to test ragged line balance}}
\end{document}
截屏:
答案1
也许不应该在这样的部分内有宏,也许这不是正确的做法,但这似乎是可行的。
\documentclass[a4paper]{article}
\usepackage{ragged2e}
\protected\def\MaybeRight{%
\leftskip 0pt
\rightskip 0pt plus 5em
\spaceskip \fontdimen2\font
\xspaceskip \fontdimen2\font
\parfillskip 0pt
\parindent 0pt}
\begin{document}
{\tiny this is what I want}\\
\parbox{\textwidth}{\section*{\RaggedRight This is some random text \\to test ragged line balance}}
{\tiny this is what I want}\\
\parbox{\textwidth}{\section*{\MaybeRight This is some random text to test ragged line balance}}
\end{document}
答案2
这是我的链接解决方案的非中心版本:
\documentclass{article}
\newcommand{\balancebox}[2]% #1 = max width, #2 = contents
{\begingroup% save registers
\dimendef\height=0
\dimendef\width=1
\dimendef\test=2
\settowidth{\test}{#2}% single line check
\width=#1\relax
\ifdim\test>\width
\settoheight{\height}{\parbox{#1}{\raggedright #2}}%
\loop
\advance\width by -1em
\settoheight{\test}{\parbox{\width}{\raggedright #2}}%
\ifdim\test=\height\repeat
\advance\width by 1em
\fi
\parbox{\width}{\raggedright\strut #2\strut}%
\endgroup}
\begin{document}
\parbox{30mm}{This is some more text\strut}
\balancebox{30mm}{This is some more text}
\end{document}
答案3
经过一番尝试,我找到了一个可行的解决方案,它基于@mickep的答案,但直接应用于节标题,从而避免了出现问题parbox
。我不太明白发生了什么,所以欢迎提出任何建议或更正。
- 创建新
\BalancedRagged
命令。 - 通过 应用于章节标题
sectsty
。 - 包括包,
microtype
因为这会改变间距。 - 拉伸
\rightskip
可调整第一行(几行)的长度:长度越大,越想将单词移到下一行。 - 拉伸使
parfillskip
最终的线具有弹性:拉伸越小,越希望最终的线与前面的线的长度相同。 \spaceskip
比默认值稍微挤压一些,因此有些行在一行而不是两行(参见示例 3)。\xspaceskip
在这些例子中似乎没有影响任何事情。\spaceskip
和均可省略\xspaceskip
,保留默认值。
对于 MWE,为了方便起见,我使用\section
显示默认值,然后使用\subsection
来显示效果\BalancedRagged
。
- 示例 1 表明
\BalancedRagged
,即使字符数正好填满行长,也不会创建新行。 - 示例 2 使用默认设置解决了主要问题,消除了孤立问题。
- 示例 3 和 4 消除了标题中的连字符。
- 示例 5 表明它也适用于三行标题。
\documentclass[a4paper]{article}
\usepackage{sectsty}
\usepackage{microtype}
\protected\def\BalancedRagged{
\leftskip 0pt
\rightskip 0pt plus 10em
\spaceskip=1\fontdimen2\font plus .5\fontdimen3\font minus 1.5\fontdimen4\font
\xspaceskip=1\fontdimen2\font plus 1\fontdimen3\font minus 1\fontdimen4\font
\parfillskip 0pt plus 15em
\relax
}
\sectionfont{\large}%
\subsectionfont{\large\BalancedRagged}%
\begin{document}
\noindent 1.
\section*{This tests sectional headings which are this exact line length}
\subsection*{This tests sectional headings which are this exact line length}
\bigskip
2.
\section*{This tests the balancedness of the lines in section headings, etc.}
\subsection*{This tests the balancedness of the lines in section headings, etc.}
\bigskip
3.
\section*{This shows the line’s resistance when it comes to hyphenation}
\subsection*{This shows the line’s resistance when it comes to hyphenation}
\bigskip
4.
\section*{This too shows the line’s resistance when it comes to hyphenation}
\subsection*{This too shows the line’s resistance when it comes to hyphenation}
\bigskip
5.
\section*{This tests the balancedness of the lines in three-line section headings, which, even though you want to avoid them, do occur}
\subsection*{This tests the balancedness of the lines in three-line section headings, which, even though you want to avoid them, do occur}
\end{document}