将绳子剪成段

将绳子剪成段

我正在写论文模板,我想在标题下划线并居中。一行的长度为 5 厘米。当标题太长而无法在一行中输入时,我必须将其分成两行、三行甚至更多行,如下所示

在此处输入图片描述

我想要自动换行,有什么好主意吗?我简化了我的需求(可能不行),并在下面提出了我的想法,但我遇到了很多问题。

我有一个 tring a,它是somewordssomewords

\newcommand{\a}{somewordssomewords}

我想把它切成几段,每段长度为 5,然后分别在它们下面划线,就像

在此处输入图片描述

我想按如下方式执行此操作:

  1. 使用包\StrLen{\a}中的获取的长度为 18xstring\a
  2. 使用包\fpeval{\StrLen{\abc}/5}中的xfp数据来获取我应该切割多少块,在这个例子中,我们将其表示为 3.6
  3. 我想使用\foreachpgffor\underline{\StrMid{\a}{5*(\x-1)+1}{5*\x}}获得下划线的“somew”、“ordss”、“omewo”和“rds”

我的问题是,

  1. 我不能使用\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}

?

我怎样才能得到我所喊切的碎片?

  1. 如何使用\xin\foreach进行计算。例如,使用类似这样的方法
\foreach \x in {1, 2, 3}{2*\x}

得到 246。

  1. 是否有一些循环语句,例如
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}

演示 2

答案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}

在此处输入图片描述

在此处输入图片描述

相关内容