将文本动态地置于段落第一行上方

将文本动态地置于段落第一行上方

我正在尝试编写一个自定义命令,将作为第一个参数输入的文本置于作为第二个参数输入的文本第一行的上方。

\documentclass{article}
\newcommand{\centerCaption}[2]{
    \textbf{#1}\par
    #2
}
\parindent=0pt
\begin{document}
    \centerCaption{Caption}{%
        This is a short line.\\
        This is a longer line with extra text.}
\end{document}

这应该输出类似这样的内容:

     Caption
This is a short line.
This is a longer line with extra text.

有没有办法检测给定文本第一行的宽度?或者还有什么其他方法可以做到这一点?

编辑:如果我的问题不清楚,我很抱歉。我希望第一个参数在此示例中相对于“这是一条短线”居中,并且通常相对于我的第二个参数的第一行居中,无论有多少行。这就是为什么我要求一种方法来仅确定第一行的宽度,而忽略后续行。

我打算在戏剧剧本中使用它,将角色的名字放在相对于第一个台词的中央,这样就不需要再添加字幕了。我知道有专门用于剧本等的软件包,但除了这个问题之外,我已经正确设置了一切。

答案1

如果下面这一行“标题“是其自身的论点。虽然我保留了标题的其余部分作为论点(#3),但(至少对于这个例子)没有令人信服的理由这样做……我可以完全消除使用#3

\documentclass{article}
\usepackage{stackengine}
\newcommand{\centerCaption}[3]{%
    \stackengine{\baselineskip}{#2}{\textbf{#1}}{O}{c}{F}{F}{L}\par
    #3
}
\parindent=0pt
\begin{document}
    \centerCaption{Caption}{%
        This is a short line.}{
        This is a longer line with extra text.}
\end{document}

在此处输入图片描述


这是未使用#3...的版本,结果相同。

\documentclass{article}
\usepackage{stackengine}
\newcommand{\centerCaption}[2]{%
    \stackengine{\baselineskip}{#2}{\textbf{#1}}{O}{c}{F}{F}{L}\par
}
\parindent=0pt
\begin{document}
    \centerCaption{Caption}{%
        This is a short line.}
        This is a longer line with extra text.
\end{document}

萃取技术

尽管合并文本比提取文本更容易,但这里有一种方法\\可以从较大的参数中提取第一行(在 之前)。限制:\\在参数中出现一次。

\documentclass{article}
\usepackage{stackengine,listofitems}
\newcommand\centerCaption[2]{%
  \setsepchar{\\}%
  \readlist\linesep{#2}%
  \centerCaptionaux{#1}{\linesep[1]}{\linesep[2]}
}
\newcommand{\centerCaptionaux}[3]{%
    \stackengine{\baselineskip}{#2}{\textbf{#1}}{O}{c}{F}{F}{L}\par
    #3
}
\parindent=0pt
\begin{document}
    \centerCaption{Caption}{%
        This is a short line.\\
        This is a longer line with extra text.}
\end{document}

相关内容