在 Plain TeX 中使用缩进的 \hrule

在 Plain TeX 中使用缩进的 \hrule

在使用了 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

相关内容