我正在尝试根据之前给出的 PowerPoint 模板实现一个 beamer 模板。现在我正处于标题页,我需要你的建议。
我完成了一组坐标计算。之后我知道了哪些区域是为标题、副标题和其他文本保留的。在 MWE 中,我在那里放置了一个红色矩形,只是暂时让它可见。
由于标题可能很长,因此可能会出现换行,因此我想使用 LeTeX 的空间对齐技术来使内容很好地对齐。这里的想法是有一个 vbox(minipage
在 MWE 中),它具有正确的大小,这样我就可以例如使用它\vfill
来均匀地间隔范围内的剩余空间,而无需手动调整坐标。此外,这还允许我省略例如副标题,并且仍然具有有效的间距。
因此,假设我有“一些”坐标(nw)
,并且(se)
我正在寻找跨越该矩形范围的迷你页面。tikzminimum height
的属性在这里用处不大,因为它修改的是节点的形状而不是内容。据我所知,tikz 的拟合库也是如此。
使用 minipage 的方法似乎效果很好,但我需要将坐标的水平和垂直距离作为传统 LaTeX 长度寄存器中的长度值。使用这些,我可以定义 minipage,就像我下面使用硬编码高度明确做的那样。
有没有更简单的方法来实现我的尝试?如何获取两个坐标的垂直距离并保存在寄存器中?
\documentclass{beamer}
\usepackage{tikz}
\setbeamertemplate{title page}{
\begin{tikzpicture}[overlay,remember picture,every node/.style={inner sep=0pt}]
\path (current page.south west) node [anchor=south west] {\rule{5cm}{4cm}}; % Logo
\path % Here comes some crazy coordinate math normally, in MEW just dummy coordinates
(current page.north east) ++(-7.5cm,-2cm) coordinate (nw) ++(6cm,-5cm) coordinate (se);
% Inside this rectangle the text should be placed
\draw [red] (nw) rectangle (se);
% Here comes a test implementation, how things could look like
\path (nw) node [anchor=north west,align=left] %
{\begin{minipage}[t][5cm]{\textwidth}
{\LARGE\bfseries The title}
\vfill
% {\Large\bfseries The subtitle}
%
% \vfill
{\Large The Author}
\vfill
{\large 01/01/2020}
\end{minipage}
};
\end{tikzpicture}
}
\begin{document}
\begin{frame}
\titlepage
\end{frame}
\end{document}
答案1
实际上,您可以利用calc
库和操作let
一次性完成此操作,而无需明确定义其他 TeX 计数器。见下文。
\setbeamertemplate{title page}{
\begin{tikzpicture}[overlay,remember picture,every node/.style={inner sep=0pt}]
\path (current page.south west) node [anchor=south west] {\rule{5cm}{4cm}}; % Logo
\path % Here comes some crazy coordinate math normally, in MEW just dummy coordinates
(current page.north east) ++(-7.5cm,-2cm) coordinate (nw) ++(6cm,-5cm) coordinate (se);
% Inside this rectangle the text should be placed
\draw [red] (nw) rectangle (se);
% Here comes a test implementation, how things could look like
\path
let \p1 = ($(nw) - (se)$) in
(nw) node [anchor=north west,align=left] %
{\begin{minipage}[t][\y1]{\textwidth}
{\LARGE\bfseries The title}
\vfill
% {\Large\bfseries The subtitle}
%
% \vfill
{\Large The Author}
\vfill
{\large 01/01/2020}
\end{minipage}
};
\end{tikzpicture}
}
答案2
至少在我重读了 pgfmanual 的某些部分后,我能够找到该问题的解决方案。
定义坐标后,我可以使用类似这样的方法将它们提取到宏中(typeout
这里只是为了调试):
\path (nw);
\pgfgetlastxy{\myfoox}{\myfooy}
\typeout{Last coordinate: \myfoox, \myfooy}
\path (se);
\pgfgetlastxy{\mybarx}{\mybary}
\typeout{Last coordinate: \mybarx, \mybary}
定义宏后,我现在可以使用以下方法为 LaTeX 寄存器分配这些值
\newlength\myfoo
\newlength\mybar
\setlength\myfoo{\myfooy}
\setlength\mybar{\mybary}
现在我可以将它们相减,得到两个坐标之间的距离(在本例中为垂直距离)。myfoo
\multiply\mybar by -1
\typeout{After negation: \the\mybar}
\advance\myfoo by \mybar
\typeout{Addition: \the\myfoo}
有了这个,我可以像这样起诉长度:
\path (nw) node [anchor=north west,align=left] %
{\begin{minipage}[t][\the\myfoo]{\textwidth}
...
\end{minipage}}