我正在写论文模板,我想在标题下划线并居中。一行的长度为 5 厘米。当标题太长而无法在一行中输入时,我必须将其分成两行、三行甚至更多行,如下所示
我想要自动换行,有什么好主意吗?我简化了我的需求(可能不行),并在下面提出了我的想法,但我遇到了很多问题。
我有一个 tring a,它是somewordssomewords
。
\newcommand{\a}{somewordssomewords}
我想把它切成几段,每段长度为 5,然后分别在它们下面划线,就像
我想按如下方式执行此操作:
- 使用包
\StrLen{\a}
中的获取的长度为 18xstring
\a
- 使用包
\fpeval{\StrLen{\abc}/5}
中的xfp
数据来获取我应该切割多少块,在这个例子中,我们将其表示为 3.6 - 我想使用
\foreach
包pgffor
并\underline{\StrMid{\a}{5*(\x-1)+1}{5*\x}}
获得下划线的“somew”、“ordss”、“omewo”和“rds”
我的问题是,
- 我不能使用
\fpeval{\alen/5}
\documentclass{article}
\usepackage{xfp, xstring}
\newcommand{\abc}{somewordssomewords}
\begin{document}
\fpeval{\StrLen{\abc}/5}
\end{document}
错误是
! You can't use `\let' after \the.
<argument> \let
l.5 \fpeval{\StrLen{\abc}/5}
?
我怎样才能得到我所喊切的碎片?
- 如何使用
\x
in\foreach
进行计算。例如,使用类似这样的方法
\foreach \x in {1, 2, 3}{2*\x}
得到 246。
- 是否有一些循环语句,例如
while \StrLen{\a} > 5
cut left 5 words and underline
\a = string cutted the left 5 words
end
如果有的话,我的工作就很容易了
答案1
只要\baselineskip
您的文本中没有变化且没有垂直间隙,您可能可以使用调整框来测量带有居中文本的框的高度,并放置另一个具有相同测量值的框,其中包含由水平引线组成的垂直引线以创建线条。
这样,线条就会画在文本上。因此,如果文本颜色和线条颜色不同,我不建议使用这种方法。
\documentclass[12pt]{article}
\usepackage{adjustbox}
\newlength\myheight
\newcommand\Mysavedprevdepth{}%
\newcommand\UnderlineCentered[3]{%
\begin{adjustbox}{minipage=[t]{\dimexpr#1\relax},gstore totalheight=\myheight,margin=0pt}%
\centering\leavevmode#3\par\xdef\Mysavedprevdepth{\the\prevdepth}%
\end{adjustbox}%
\hspace*{-\dimexpr#1\relax}%
\begin{adjustbox}{minipage=[t][\myheight]{\dimexpr#1\relax},margin=0pt}%
\vphantom{Eg}\lower\dimexpr#2\relax\hbox to\hsize{\leaders\hrule\hfill\kern0pt}\par
\kern-\dimexpr#2\relax
\xleaders\vbox to\baselineskip {\vfill\hbox{\lower\dimexpr#2\relax\hbox to\hsize{\leaders\hrule\hfill\kern0pt}}\kern-\dimexpr#2\relax}\vfill
\kern\Mysavedprevdepth
\end{adjustbox}%
}%
\usepackage{lipsum}
\begin{document}
\noindent\xleaders\hbox{X}\hfill\null
\bigskip
\begingroup\centering\UnderlineCentered{5cm}{1mm}{\lipsum[12]}\par\endgroup
\bigskip
\noindent\xleaders\hbox{X}\hfill\null
\bigskip
\UnderlineCentered{5cm}{1mm}{AAA}
\bigskip
\UnderlineCentered{5cm}{1mm}{}
\end{document}
答案2
这会将格式化的标题放入保存框,并\vsplit
在循环中将其分成几行并\hrule
加下划线。
\documentclass{article}
\newcommand{\foo}[1]% #1 = title
{\par\noindent\hfil\parbox{5cm}{%
\setbox0=\vbox{\centering #1}%
\loop\ifvoid0\else
\setbox1=\vsplit0 to \ht\strutbox
\unvbox1\hrule
\repeat}\par}
\begin{document}
\foo{This is a long sentence to complete}
\end{document}
此版本使用 varwidth 尽可能减小宽度。
\documentclass{article}
\usepackage{varwidth}
\newcommand{\foo}[1]% #1 = title
{\bgroup% use local registers
\sbox0{\begin{varwidth}{5cm}
\centering #1
\end{varwidth}}
\par\noindent\hfil\parbox{\wd0}{%
\setbox0=\vbox{\centering #1}%
\loop\ifvoid0\else
\setbox1=\vsplit0 to \ht\strutbox
\unvbox1\hrule
\repeat}\par
\egroup}
\begin{document}
\foo{This is a long sentence to complete}
\end{document}
答案3
除了直接使用 TeX 代码以编程方式断行之外,\underline
你还可以考虑使用以下允许断行下划线的软件包之一
ulem
(无自动连字)soul
(自动连字但对于某些输入来说很脆弱)lua-ul
(仅适用于 LuaLaTeX,但目前为止是最好的)
这些都不会在文本块的一端和另一端划一条线,而只会在您的单词下划线。
\documentclass[]{article}
\newcommand\showulresult[2]
{%
\par
Using \textsf{#1}:\par
\fbox{\begin{minipage}{5cm}
\centering\huge\bfseries
#2%
{%
This is a long sentence to complete with
Supercalifragilisticexpialidocious%
}
\end{minipage}}%
\bigskip
}
\usepackage{soul}
\usepackage[normalem]{ulem}
\usepackage{lua-ul}
\begin{document}
\showulresult{soul}{\ul}
\showulresult{ulem}{\uline}
\showulresult{lua-ul}{\underLine}
Using \textsf{ulem} with manual hyphenation:\par\nobreak
\fbox{\begin{minipage}{5cm}
\centering\huge\bfseries
\uline
{%
This is a long sentence to complete with
Super\-cali\-fragi\-listic\-expi\-ali\-docious%
}
\end{minipage}}%
\bigskip
\end{document}