如何使用钩子来改变 minipage 中的 \parskip?

如何使用钩子来改变 minipage 中的 \parskip?

我尝试使用钩子来改变环境\parskip中的内容minipage。但我的代码不起作用。

这是一个 MWE。

\documentclass{article}

\AddToHook{env/minipage/begin}{\setlength{\parskip}{2em}}

\begin{document}
    \begin{minipage}[t]{0.5\linewidth}
        paragraph 1.
    
        paragraph 2.
    
        paragraph 3.
    \end{minipage}%
    \begin{minipage}[t]{0.5\linewidth}
        \setlength{\parskip}{2em}
    
        paragraph 1.
    
        paragraph 2.
    
        paragraph 3.
    \end{minipage}
\end{document}

第一个小页面的 \parskip 尚未被修改。

我已经知道了

\newcommand{\@minipagerestore}{\setlength{\parskip}{0.5em}}

可以达到我想要的效果。我只是想知道为什么我的代码没有达到目的。

答案1

minipage是一个特殊的环境,从第一天起就有一个钩子。Lamport 的想法是,应该minipage从“干净的纸张状态”开始,并有一些共同的代码\parbox(记住,内存很稀缺)。所以minipage在实际开始排版文本之前,会进行一些清理:首先它

\@parboxrestore

然后它设置脚注和列表(特定于minipage),

\@minipagerestore

最后在每个段落的开头\@setminipage设置。什么是?它根据(存储和的列中使用的代码)定义,并负责重置、和等。\@minipagetrue\@parboxrestore\@arrayparboxrestoreptabulararray\parindent\parfillskip\baselineskip\parskip

实际上,的默认含义\@minipagerestore\relax,但它可用于用户想要在其所有minipage环境中进行的进一步设置。

注意,所有这些都已完成环境已启动,特别是在env/minipage/begin钩子被执行之后。

我同意在理想世界中 中的代码\AddToHook{env/minipage/begin}应该作为 的一部分执行\@minipagerestore,但不幸的是 hooks 是在 实现四十年后才出现的minipage

你可能会想象

\AddToHook{cmd/@minipagerestore/end}{\setlength{\parskip}{2em}}

但遗憾的是,这不起作用,因为\@minipagerestore定义为

\let\@minipagerestore=\relax

所以你可以

\ExpandArgs{cc}\NewCommandCopy{@minipagerestore}{@empty}
\AddToHook{cmd/@minipagerestore/end}{\setlength{\parskip}{2em}}

完整示例

\documentclass{article}

\ExpandArgs{cc}\NewCommandCopy{@minipagerestore}{@empty}
\AddToHook{cmd/@minipagerestore/after}{\setlength{\parskip}{2em}}

\begin{document}

\makeatletter\show\@minipagerestore

\noindent
    \begin{minipage}[t]{0.5\linewidth}
        paragraph 1.
    
        paragraph 2.
    
        paragraph 3.
    \end{minipage}%
    \begin{minipage}[t]{0.5\linewidth}
        \setlength{\parskip}{2em}
    
        paragraph 1.
    
        paragraph 2.
    
        paragraph 3.
    \end{minipage}
\end{document}

在此处输入图片描述

答案2

您的代码存在问题,因为env/minipage/begin钩子不适合修改\parskip内部minipage.。相反,您应该定义\@minipagerestore命令。

在下面的代码中我给出了:

\documentclass{article}

\makeatletter
\newcommand{\@minipagerestore}{\setlength{\parskip}{2em}}
\makeatother

\begin{document}
    \begin{minipage}[t]{0.5\linewidth}
        paragraph 1.
    
        paragraph 2.
    
        paragraph 3.
    \end{minipage}%
    \begin{minipage}[t]{0.5\linewidth}
        \setlength{\parskip}{2em}
    
        paragraph 1.
    
        paragraph 2.
    
        paragraph 3.
    \end{minipage}
\end{document}

您获得了所需的输出:

图像

相关内容