仅当行太长时才换行,但换行不会创建新页面

仅当行太长时才换行,但换行不会创建新页面

我是contracard用于排版传统舞蹈名片的包/类。目前,如果您在名片上排版特别长的图形,它会像这样包装(查看 B1 中的“女士左手星形”):

对舞排版正常

但是,按照舞蹈卡的工作方式,如果你正在阅读列表,你的眼睛需要直接跳到每个动作的开头。当一行像这样换行时,我希望它在分隔符(在本例中是分号)处断开,如下所示:

对舞排版正确

这让你的视线更容易跳到女士链上。不幸的是,事情远不止于此。

由于我们在这里处理索引卡,而且空间相当紧张,所以我只想在这样做会不是contra在包含环境(我的包中的环境,或mweenv下面的 MWE)内的任何位置创建分页符。

例如,如果你有一行非常非常长的文字,占据了一整行和上一行的一部分:

| A1. This is a figure; This is a really, really, long     |
|     figure that takes up an entire line and the next one |

并在分号处将其断开:

| A1. This is a figure;
|     This is a really, really, long figure that takes up  |
|     an entire line and the next one |

新建的(第三)行有可能导致出现新的分页符。如果是这样,则应保留此行。

起初我以为这很简单,只需获取行上剩余的空间,检查新移动文本的宽度是否小于该宽度,如果不小于,则中断。然而,根据网上的几个帖子,这些信息无法从 TeX 的编程层获得,所以这是不可能的。

然后,我想到我可以将之前的动作文本存储在某个临时宏中,将整行与\columnwidth(这应该始终是一列,但我想你永远不知道),并且只有当它更长时才中断。这实际上很难做到,因为一行上可能有两个以上的动作,分号和逗号等会在某些计数时插入,等等。这并非无法克服,但是,它只是需要大量的摆弄,最终会变得相当黑客化。

至于检查是否创建了分页符,我想不出一种方法来做到这一点,除非将页数保存到临时文件中,然后对每个长行重新编译一次以查看它们是否发生变化。如果你有多个舞蹈,这会变成很多编译(如果您有 10 个舞蹈,其中有 4 个长数字,每个数字需要两次重新编译,即需要 80 次重新编译)。

我的问题很简单:

我是不是把这个弄得太复杂了?有没有更好的方法,或者用其他方式让这一行更容易阅读?

下面给出了一个 MWE(有点像;这里真正需要的可能是描述,因为很多使情况变得复杂的特定于包的内容不能出现在 MWE 中):

\documentclass{article}
%
\usepackage[margin=0.5in,top=0.75in,paperwidth=6in,paperheight=4in]{geometry}
\usepackage{ifthen}
%
\newenvironment*{mweenv}{}{}%
\newcounter{textcounter}
\setcounter{textcounter}{1}
\newcommand{\inserttext}[1]{%
 \ifthenelse{\value{textcounter}=1}{\par}{}#1%
 \ifthenelse{\value{textcounter}=1}{;\ \setcounter{textcounter}{0}}{\setcounter{textcounter}{1}}%
}
%
\begin{document}
%
\begin{mweenv}
\inserttext{This is a long line that wraps around the document}%
\inserttext{A line break should happen at the semi-colon if it would not cause
the page to break as well.}
\inserttext{This is more text}\inserttext{It should not break}%
\end{mweenv}
%
\end{document}

抱歉,这个问题很长,而且比较模糊。如果需要澄清,请告诉我。(值得注意的是,这个问题是关于这一具体问题在 GitHub 上)

答案1

通常情况下,您不需要测量,只需平衡惩罚以鼓励在所需点中断即可。另外,不要在环境内分配计数器,只需分配一次并重复使用相同的计数器。(实际上,计数寄存器对于切换来说有点过分,但我在这里保留了它)

在此处输入图片描述

\documentclass{article}
%
\usepackage[margin=0.5in,top=0.75in,paperwidth=6in,paperheight=4in]{geometry}
\usepackage{ifthen}
%
\newcounter{textcounter}

\newenvironment*{mweenv}{\raggedright}{}%
\setcounter{textcounter}{1}%
\newcommand{\inserttext}[1]{%
 \ifthenelse{\value{textcounter}=1}{\par}{}#1%
 \ifthenelse{\value{textcounter}=1}{;\linebreak[2]\space\setcounter{textcounter}{0}}{\setcounter{textcounter}{1}}%
}
%
\begin{document}
%
\begin{mweenv}
\inserttext{This is a long line that wraps around the document}%
\inserttext{A line break should happen at the semi-colon if it would not cause
the page to break as well.}
\inserttext{This is more text}\inserttext{It should not break}%
\end{mweenv}
%
\end{document}

相关内容