当我们使用宏时\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}
您还可以应对\\[<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}
答案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}