我正在创建一个自定义命令,基本上打印一条水平线、一个字符和另一条水平线。代码如下
\newcommand{\breaknote}{\noindent\rule[.5ex]{.5\textwidth}{.4pt}\S\rule[.5ex]{.5\textwidth}{.4pt}}
显然,这超出了文本边距,引发了Overful \hbox
错误。
问题是:有没有办法得到单身的字符,然后使用这个数字或将其存储在变量中,比如说\charwidth
?我想要实现的是类似于
\newcommand{\breaknote}{\noindent\rule[.5ex]{.5\textwidth - .5\charwidth}{.4pt}\S\rule[.5ex]{.5\textwidth - .5\charwidth}{.4pt}}
这样就完美了。我知道我可以查看错误字符串并从那里获取实际的文本溢出(以 pts 为单位),从而读取字符长度,但我想知道是否有更清晰的方法。
答案1
\documentclass{article}
\usepackage{calc}
\usepackage{lipsum}
\usepackage[showframe]{geometry}
\newlength{\charwidth}
\setlength{\charwidth}{\widthof{\S}}
\newcommand{\breaknote}{\par\noindent\rule[.5ex]{.5\textwidth - .5\charwidth}{.4pt}\S\rule[.5ex]{.5\textwidth - .5\charwidth}{.4pt}\par}
\begin{document}
\lipsum[1]
\breaknote
\lipsum[2]
\end{document}
答案2
\newlength{\charwidth}
...
\settowidth{\charwidth}{\S}
或者如果calc
使用包,它支持\widthof
内部计算(\setlength
,\addtolength
)。
答案3
对于手头的问题,还可以使用\hrulefill
和的组合\raisebox
:
\documentclass{article}
\usepackage{lipsum}
\newcommand{\breaknote}{%
\vspace*{-0.5ex}%
\par\noindent\hrulefill\raisebox{-0.5ex}{\S}\hrulefill\par
\vspace{0.5ex}%
}
\begin{document}
\breaknote
\lipsum[1]
\breaknote
\end{document}