我希望命令\lineseprule
显示为一条可自定义宽度的水平线。它既不应占用整行的高度(\linesepruleA
见下文),也不应关闭上下行(以上升部和下降部的高度影响周围行之间的间距的方式;\linesepruleB
见下文)。相反,它应该简单地插入行之间,就像它自己的非常细的线一样。
的垂直间距取决于\linesepB
上升部和下降部:
\documentclass{article}
\usepackage{chancery}
\parindent0pt % disablement of paragraph indentation
\newcommand*{\linesepruleA}[1]{\par \rule{#1}{.4pt}\par}
\newcommand*{\linesepruleB}[1]{\par \hrule width#1 height.4pt}
\begin{document}
{\large\underline{Shopping list}}
\bigskip
toilet paper \par
kitchen rolls \par
detergent \par
\linesepruleA{4em} % too high
toothbrush \par
toothpaste \par
\linesepruleB{4em} % see below
milk \par
cereals \par
\vspace{2\baselineskip}
\hrulefill\par
{\small\verb|The vertical spacing for \linesepruleB depends on ascenders and descenders:|}
\medskip
a \par
\linesepruleB{4em} % much too close
o \par
\medskip
g \par
\linesepruleB{4em} % still too close
b \par
\end{document}
澄清一下:我假设线条具有特定的顶部和底部边界。对我的问题的一个有意义的解释是:(1) 选择一个有意义的位置(例如,将水平线放置在“第一行基线上方半 x 高度”和“第二行基线上方半 x 高度”的中间,或者 (2) 让用户使用参数自定义它,该参数允许用户选择第一行基线下方的垂直距离或与上面 (1) 中描述的默认值的垂直偏差。
补充澄清:马丁·沙雷尔告诉我们和分别\ht\strutbox
是\dp\strutbox
和.7\baselineskip
。.3\baselineskip
(Steven B. Segletes 写了一个解决方案,涵盖了我所想到的所有问题,使用了.7\baselineskip
下线基线上方的默认值。)
答案1
此方法使用stackengine
包将 放置\rule
在基线上方一定量的位置。规则长度是强制参数,规则高度是可选参数(默认.7\baselineskip
)规则被打破以占用零高度,并且使用stackengine
设施,宽度也是零。
根据 OP 的要求,我编辑了解决方案以执行两件事:1) 提供一个宏来设置规则厚度;2) 让可选参数指示规则的中心(而不是底部)。OP 的第三个请求是根据规则厚度增加行距,已添加,使用新宏\lineaddrule
,而不是\lineseprule
(处理前两种情况)。这两个宏非常相似,因此可以在单个宏中设置一个参数来执行一件事或另一件事,而不是设置两个单独的宏。
\documentclass{article}
\usepackage{chancery}
\usepackage{stackengine}
\newlength\rulethickness
\newcommand\setlineseprule[1][.2pt]{%
\setlength\rulethickness{#1}}
\setlineseprule
\newcommand\lineseprule[2][.7\baselineskip]{%
\def\useanchorwidth{T}\def\stackalignment{l}\def\stacktype{L}%
\hspace{0pt}\smash{\stackon[#1]{}{%
\rule[-.5\rulethickness]{#2}{\rulethickness}}}%
\ignorespaces}
\newcommand\lineaddrule[2][.7\baselineskip]{%
\def\useanchorwidth{T}\def\stackalignment{l}\def\stacktype{L}%
\vspace{\rulethickness}%
\hspace{0pt}\smash{\stackon[#1]{}{%
\rule{#2}{\rulethickness}}}%
\ignorespaces}
\parindent0pt % disablement of paragraph indentation
\begin{document}
{\large\underline{Shopping list}}
\bigskip
toilet paper \par
kitchen rolls \par
detergent \par
\lineseprule{4em}
toothbrush \par
toothpaste \par
\lineseprule{4em}
milk \par
cereals \par
\vspace{2\baselineskip}
\hrulefill\par
{\small\verb|The vertical spacing for \lineseprule can be adjusted|\\
\verb|for ascenders and descenders:|}
\medskip\setlineseprule[2pt]
a \par
\lineseprule[.7\baselineskip]{4em}
o \par\setlineseprule[12pt]
a \par
\lineaddrule[.7\baselineskip]{12em}
o \par
\medskip\setlineseprule
g \par
\lineaddrule[.57\baselineskip]{4em}
o \par
\end{document}
答案2
TeX 不会在规则和框之间添加行间粘连(无论以何种顺序)。所以\hrule
你需要的是:
\documentclass{article}
\usepackage{chancery}
\setlength{\parindent}{0pt} % disable paragraph indentation
\newlength{\linesepskip}
\setlength{\linesepskip}{1pt} % adjust to suit
\newcommand*{\linesep}[1]{%
\par\nobreak\vspace{\linesepskip}
\hrule width #1 height 0.2pt depth 0.2pt\relax
\nobreak\vspace{\linesepskip}
}
\begin{document}
{\large\underline{Shopping list}}
\bigskip
toilet paper \par
kitchen rolls \par
detergent \par
\linesep{4em}
toothbrush \par
toothpaste \par
\linesep{4em} % see below
milk \par
cereals \par
\medskip
a \par
\linesep{4em}
o \par
\medskip
g \par
\linesep{4em}
b \par
\end{document}
如果您不想禁用行间跳过计算,则必须使用不同的定义。
\documentclass{article}
\usepackage{chancery}
\setlength{\parindent}{0pt} % disable paragraph indentation
\newlength{\linesepskip}
\setlength{\linesepskip}{1pt} % adjust to suit
\newcommand*{\linesep}[1]{%
\par\nobreak
\leaders\vrule width #1\vskip 0.4pt
\nobreak
}
\begin{document}
\fbox{\begin{minipage}{2cm}
detergent \par
\linesep{4em}
toothbrush
\end{minipage}}
\fbox{\begin{minipage}{2cm}
detergent \par
\vspace{0.4pt}
toothbrush
\end{minipage}}
\end{document}
第二个框显示的输出是通过在段落之间添加规则的粗细而获得的结果。