重新定义 \title,以便在预定义的位置强制换行

重新定义 \title,以便在预定义的位置强制换行

当我们使用宏时\title{Some Title},宏只是将其分配Some Text给另一个内部宏\@title,定义如下latex.ltx

\def\title#1{\gdef\@title{#1}}

我们可以\@title在文档的各个地方使用,例如,在\hypersetup{pdftitle={\@title}}pdf-meta 中,或者在文档的其他地方。例如,如果标题看起来像

\title{The World Big Idea: with small corrections}

此处有些地方需要显示为The World Big Idea:换行符with small corrections。但在另一些地方,它应该保持在一行中。

如何重新定义\title或者可行,还有其他好的想法吗?

\documentclass[]{article}

\title{Some Title}

    \begin{document}

    \makeatletter
        \@title % One can use \@title in different places
    \makeatother

    \makeatletter 
        %\@title Here one need to use the same text, but with line breack between "Same" and "Tile"
        Some\\Title
    \makeatother
\end{document}

答案1

这是一个天真的想法。

\@title在via的定义中使用占位符\title,并根据上下文的要求重新定义该占位符变量。

\documentclass[]{article}

\newcommand*{\mypossiblenewline}{\newline}
\title{Some \mypossiblenewline Title}

\begin{document}
\makeatletter
  \@title
\makeatother

\makeatletter 
  \begingroup
  \renewcommand*{\mypossiblenewline}{}
  \@title
  \endgroup
\makeatother
\end{document}

你可以用一个命令来完成这个操作,例如

\makeatletter
\DeclareRobustCommand*{\sergiotitlenobreak}{%
  \begingroup
  \renewcommand*{\mypossiblenewline}{}%
  \@title
  \endgroup
}
\DeclareRobustCommand*{\sergiotitlewithbreak}{%
  \begingroup
  \renewcommand*{\mypossiblenewline}{\newline}%
  \@title
  \endgroup
}
\makeatother

但这是无法扩展的(根据具体情况,这可能是一个问题)。

答案2

保存另外两个变量,由于缺乏创造力,我将它们命名为\realtitle\inlinetitle。在第二个变量中,\\标记被空格替换,首先删除两侧的空格\\。因此,输入任何

\title{Some Title \\ with line breaks}
\title{Some Title\\ with line breaks}
\title{Some Title\\with line breaks}

这是代码。

\documentclass{article}
\usepackage{xparse}
\usepackage{hyperref}

\ExplSyntaxOn
\RenewDocumentCommand{\title}{m}
 {
  \tl_gset:cn { @title } { #1 } % needed by \maketitle
  \tl_gset:Nn { \realtitle } { #1 }
  \seq_set_split:Nnn \l_tmpa_seq { \\ } { #1 }
  \tl_gset:Nx \inlinetitle { \seq_use:Nn \l_tmpa_seq { ~ } }
 }
\ExplSyntaxOff

\author{author}
\title{Some Title \\ with line breaks}

\hypersetup{
  pdftitle=\inlinetitle
}


\begin{document}

\maketitle

The title of this document is ``\inlinetitle''.

\begin{center}
\realtitle
\end{center}

\end{document}

enter image description here

您还可以应对\\[<dimen>]

\documentclass{article}
\usepackage{xparse}
\usepackage{hyperref}

\ExplSyntaxOn
\RenewDocumentCommand{\title}{m}
 {
  \tl_gset:cn { @title } { #1 } % needed by \maketitle
  \tl_gset:Nn { \realtitle } { #1 }
  \tl_set:Nn \inlinetitle { #1 }
  \regex_replace_all:nnN { \s* \c{\\}(\[[^\]]*\])+ \s* } { \  } \inlinetitle
 }
\ExplSyntaxOff

\author{author}
\title{Some Title \\[1ex] with line breaks \\[1ex] and added spacing}

\hypersetup{
  pdftitle=\inlinetitle
}


\begin{document}

\maketitle

The title of this document is ``\inlinetitle''.

\begin{center}
\realtitle
\end{center}

\end{document}

enter image description here

答案3

不同的方法:不用重新定义\@title,你可以使用它\texorpdfstring来指定两个版本,一个版本没有换行符,将用于 pdf 元数据,另一个版本有换行符,将显示在 pdf 中

\documentclass[]{article}

\usepackage{hyperref}

\title{\texorpdfstring{Some\newline Title}{Some title}}

    \begin{document}

    \makeatletter
        \@title % One can use \@title in different places
    \makeatother

\end{document}

相关内容