宏中的换行符

宏中的换行符

我在文档中定义了一个宏,如下所示

\newcommand{\FSeq}[2]{\ensuremath #1_1, #1_2, \ldots,  #1_#2}

问题是,通常会超出范围。

有没有办法解决这个问题?我尝试了其他一些解决方案,但没有成功。提前致谢。

编辑:最小示例

\documentclass{article}  
\newcommand{\FSeq}[2]{\ensuremath #1_1, #1_2, \ldots,  #1_#2}
\begin{document}  
bla bla bla bla bla bla bla bla bla bla bla bla bla bla bla bla aaaaa  $\FSeq{R}{r}$ bla bla bla bla bla bla bla bla bla bla bla bla bla bla bla bla bla bla bla bla bla bla bla bla bla bla bla bla bla bla bla bla bla bla bla bla 
\end{document}

答案1

我会避免自动中断,并在其他技巧无法奏效的地方提供允许自动中断的选择。

\usepackage{xparse}
\NewDocumentCommand{\FSeq}{smm}{%
  \IfBooleanTF{#1}
    {#2_{1},\allowbreak #2_{2},\dots,\allowbreak #2_{#3}}
    {#2_{1}, #2_{2},\dots, #2_{#3}}%
}

因此$\FSeq{x}{n}$不允许休息,但在需要的情况下只需添加一个*意愿,即可$\FSeq*{x}{n}$

示例文档:

\documentclass[draft]{article} % draft makes overfull hboxes visible

\usepackage{xparse}
\NewDocumentCommand{\FSeq}{smm}{%
  \IfBooleanTF{#1}
    {#2_{1},\allowbreak #2_{2},\dots,\allowbreak #2_{#3}}
    {#2_{1}, #2_{2},\dots, #2_{#3}}%
}

\begin{document}

bla bla bla bla bla bla bla bla bla bla bla bla bla bla bla bla aaaaa $\FSeq{R}{r}$ bla bla bla bla bla bla bla bla
bla bla bla bla bla bla bla bla bla bla bla bla bla bla bla bla bla bla bla bla bla bla bla bla bla bla bla bla

bla bla bla bla bla bla bla bla bla bla bla bla bla bla bla bla aaaaa $\FSeq*{R}{r}$ bla bla bla bla bla bla bla bla
bla bla bla bla bla bla bla bla bla bla bla bla bla bla bla bla bla bla bla bla bla bla bla bla bla bla bla bla

\end{document}

在此处输入图片描述

如果由于某些原因,该xparse包不可用,则可以使用使用 *-variant 定义命令的旧方法:

\makeatletter
\DeclareRobustCommand{\FSeq}{\@ifstar\olmos@sfseq\olmos@fseq}
\newcommand{\olmos@sfseq}[2]{%
  #1_{1},\allowbreak #1_{2},\dots,\allowbreak #1_{#2}%
}
\newcommand{\olmos@fseq}[2]{%
  #1_{1}, #1_{2},\dots, #1_{#2}%
}
\makeatother

或者,使用两个宏而不是三个宏,

\makeatletter
\DeclareRobustCommand{\FSeq}{%
  \@ifstar{\@tempswatrue\olmos@fseq}{\@tempswafalse\olmos@fseq}}
\newcommand{\olmos@fseq}[2]{%
  #1_{1},\if@tempswa\allowbreak\fi #1_{2},\dots,%
  \if@tempswa\allowbreak\fi #1_{#2}%
}
\makeatother

答案2

对于您的问题,我可以考虑一些解决方案:

改进但不是解决方案

您可以\allowbreak在宏中添加一些命令,如下所示

\newcommand{\FSeq}[2]{\ensuremath{#1_1,\allowbreak #1_2,\allowbreak \ldots,\allowbreak #1_#2}}

,为什么这样更好?这样,如果表达式超出边界,TeX 就可以在表达式中间将其打断。

为什么这不是一个解决方案?因为如果 TeX 无法调整行中单词之间的间距以使其不交叉,则表达式的某些部分仍可能会超出边界(见下图)。

第一个想法的输出

此外,将数学表达式分成两行也是不好的......

“手动”解决方案

您可以在编译后使用 .log 文件查看文档,以跟踪Overfull \hbox警告并调整超出边界的 .tex 文件。通常,一个好主意是使用\[ \]来显示您的表达式(或dmath来自breqn包的环境)。但是,在您的情况下,您定义的宏是引用一个序列(我猜是从名称和输出中得出的),在这样的环境下打印可能看起来很尴尬……

那么解决方案就是重新措辞您遇到Overfull \hbox警告的段落。

自动解决?

我目前正在尝试开发一个脚本,该脚本可以自动检测Overfull \hbox警告并在多次编译后调整 .tex 文件以处理它们并将数学表达式放入环境中dmath而不是内联模式(请参阅我的相关问题)。

如果我对此解决方案有一些见解,我将更新此答案...

相关内容