如何相对于前一次调用 \setstretch?

如何相对于前一次调用 \setstretch?

这就是我想做的事情:

\documentclass{article}
\usepackage{setspace}
\begin{document}
\begin{center}
  \setstretch{1.2}
  \begin{center}
    \setstretch{0.9} // here I need it to become 0.9 * 1.2
  \end{center}
\end{center}
\end{document}

答案1

您可以使用浮点计算工具定义一个\setrelativestretch命令。xfp

诀窍在于当前因子存储在中\baselinestretch,但我们需要确保在调用之前对其进行扩展\setstretch

在例子中,我夸大了一些因素,只是为了使结果更加明显。

内部之后,\end{center}拉伸因子将自动恢复为其先前的值。

\documentclass{article}
\usepackage{setspace}
\usepackage{xfp}

\usepackage{lipsum} % for mock text

\newcommand{\setrelativestretch}[1]{%
  \begingroup\edef\x{\endgroup
    \noexpand\setstretch{\fpeval{(#1)*(\baselinestretch)}}%
  }\x
}

\begin{document}
\begin{center}
\setstretch{1.5}
\lipsum[3][1-5]
\begin{center}
\setrelativestretch{0.7}
\lipsum[4][1-5]
\end{center}
\lipsum[5][1-5]
\end{center}

\end{document}

在此处输入图片描述

从概念上讲,使用以下特征的更好的解决方案expl3

\documentclass{article}
\usepackage{setspace}
\usepackage{xparse}

\usepackage{lipsum} % for mock text

\ExplSyntaxOn
\cs_new_eq:NN \yegor_setstretch:n \setstretch
\cs_generate_variant:Nn \yegor_setstretch:n { e }

\NewDocumentCommand{\setrelativestretch}{m}
 {
  \yegor_setstretch:e { \fp_eval:n {(#1)*(\baselinestretch)} }
 }
\ExplSyntaxOff

\begin{document}
\begin{center}
\setstretch{1.5}
\lipsum[3][1-5]
\begin{center}
\setrelativestretch{0.7}
\lipsum[4][1-5]
\end{center}
\lipsum[5][1-5]
\end{center}

\end{document}

我为它定义了一个别名,\setstretch因此我也可以为它定义一个首先扩展其参数的变体。

相关内容