我尝试使用钩子来改变环境\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
\@arrayparboxrestore
p
tabular
array
\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}
您获得了所需的输出: