在使用了 20 年的高级软件包(例如 LaTeX)之后,我正在尝试学习 TeX 的‘金属’。
在我的测试文档中,我有一个代表简单食谱的缩进块。我用两个宏创建了它,分别用于食谱的开始和结束:
\def\beginrecipe{
\par
\begingroup
\leftskip=\baselineskip
\multiply\leftskip by 2
\rightskip=\leftskip
\parindent=-\baselineskip
\parfillskip=0pt plus 1fil
\reciperule
}
\def\endrecipe{
\par
\reciperule
\endgroup
}
我希望配方块在顶部和底部有水平规则,因此我将\reciperule
命令定义为:
\def\reciperule{
\vskip0.5em\hrule\vskip0.5em
}
在文档中,它的用法如下:
\beginrecipe
{\bf Blonde roux}
2 tbsp of butter.
2 tbsp of flour.
Melt the butter in a pan and add the flour.
Cook the flour without browning for 2 minutes, stirring with a whisk.
\endrecipe
效果不错,但是\hrule
太宽了。它跨越了文本块的宽度,我希望它刚好填满菜谱的宽度。所以它应该\baselineskip
从左边开始,然后\baselineskip
从右边延伸。
我尝试使用\hskip\baselineskip
和 来\hrulefill
填充可用空间。问题是\hskip
保留了一行的高度,这太多了,我希望规则更细。
我可以缩进\hrule
(我知道我可以设置它的宽度,所以这样做可行),或者我可以让\hskip
、\hrulefill
等具有指定的高度吗?
或者有没有更简单的方法来完成整个事情(不使用 Plain TeX 以外的包)?
答案1
你必须有\moveright
一个带有规则的框,但也要注意规则前的分页符
\def\beginrecipe{
\par
\begingroup
\leftskip=\baselineskip
\multiply\leftskip by 2
\rightskip=\leftskip
\parindent=-\baselineskip
\parfillskip=0pt plus 1fil
\nobreak
\reciperule
}
\def\endrecipe{
\par\nobreak
\reciperule
\endgroup
}
\def\reciperule{
\nointerlineskip
\vskip0.5em
\moveright\baselineskip\vbox{
\advance\hsize-3\baselineskip
\hrule width \hsize
}
\nointerlineskip
\nobreak
\vskip0.5em
}
\beginrecipe
{\bf Blonde roux}
2 tbsp of butter.
2 tbsp of flour.
Melt the butter in a pan and add the flour.
Cook the flour without browning for 2 minutes, stirring with a whisk.
Cook the flour without browning for 2 minutes, stirring with a whisk.
\endrecipe
\bye
答案2
请始终发布完整的文档而不是片段。
你要么需要使用规则之内一个段落,以便它自动遵循段落设置,\leftskip
或者您需要通过\leftskip
“手动”将其移动。
这显示了原始方法和两种方法(对垂直空间有不同的影响)
更新:我刚刚注意到你(有点奇怪?)有一个负面的 parindent 如果您希望规则与文本对齐,您需要将其更改\noindent
为\indent
以便它同样向左移动。
\def\beginrecipe{
\par
\begingroup
\leftskip=\baselineskip
\multiply\leftskip by 2
\rightskip=\leftskip
\parindent=-\baselineskip
\parfillskip=0pt plus 1fil
\reciperule
\reciperulea
\reciperuleb
}
\def\endrecipe{
\par
\reciperule
\reciperulea
\reciperuleb
\endgroup
}
I want the recipe blocks to have horizontal rules at the top and bottom, so I've defined my reciperule command to be:
\def\reciperule{
\vskip0.5em\hrule\vskip0.5em
}
\def\reciperulea{
\vskip0.5em\noindent\hrulefill\hbox{}\par\vskip0.5em
}
\def\reciperuleb{
\vskip0.5em
\dimen0\hsize
\advance\dimen0-\leftskip
\advance\dimen0-\rightskip
\moveright\leftskip\vbox{\hrule width\dimen0}
}
In the document this is used something like:
\beginrecipe
{\bf Blonde roux}
2 tbsp of butter.
2 tbsp of flour.
Melt the butter in a pan and add the flour.
Cook the flour without browning for 2 minutes, stirring with a whisk.
\endrecipe
\bye