我想使用固定宽度 ( .85\paperwidth
) 的隐形 tikz 矩阵在投影仪幻灯片中插入文本,左上部分有 2 列(约 3 厘米),右上部分也有类似的列。只有一个矩阵,中间有一个空列用作间隔。这样两个块将对称放置。
主要问题是中间列宽度的计算。我考虑设置矩阵设置并分别设置列 1、2、4、5 的宽度,这样会自动调整中间列的宽度,使整个矩阵宽度等于我的设置,但这样做不起作用。此外,我无法设置用于设置列 1、2、4、5 宽度的minimum width = .8\paperwidth
用途。width("x")
\documentclass{beamer}
\newlength{\slw}\setlength{\slw}{160mm}
\newlength{\slh}\setlength{\slh}{100mm}
\geometry{verbose,papersize={\slw,\slh}}
\usepackage{tikz,calc,xfp}
\usetikzlibrary{calc,matrix}
\tikzset{
allmatrix/.style = {matrix of nodes, rounded corners = 1mm,
nodes in empty cells,matrix anchor=#1,
row sep=-\pgflinewidth, column sep=-\pgflinewidth,
ampersand replacement=\&, nodes={outer sep=0pt},
text height=1.5ex, text depth=.25ex},
table/.style args= {#1/#2}{
column #1/.append style={nodes={align=left,
minimum width={\fpeval{#2 + 2 * 2mm}pt}, text width=#2}},
}}
\begin{document}
\begin{frame}
\begin{tikzpicture}[overlay,remember picture]
\matrix at (current page.north)
[shift={(0,-2)}, allmatrix=north, nodes={draw},
table/.list={1/3cm,
2/3cm,
4/3cm,
5/3cm}] (mytab)
% table/.list={1/width("le monde"),
% 2/width("new york times"),
% 4/width("le figaro"),
% 5/width("southern echo")}] (near)
{
le monde \& new york times \& \& le figaro \& southern echo\\
innadu \& le maine \& \& penpavar \& the hindu \\
times \& spectrum \& \& science \& nature \\
};
\end{tikzpicture}
\end{frame}
\end{document}
答案1
除非您真的需要它,否则不要使用\fpeval
它(并且它不理解width("…")
哪个是 PGFmath 函数)。无论如何,PGF/TikZ 几乎将所有内容都放在 PGFmath 中,因此不需要另一个包来评估事物(除非您需要高精度)。
在下面的代码中,我完全删除了设置,minimum width
因为text width
已经指定了节点的宽度。PGF 只是添加了值/pgf/inner xsep
两侧。
我选择将列 sep 设置为第二列和第三列(共四列)之间,而不是伪空列。为此,我预设了值键,/tikz/user1850133 column sep
并且在执行过程.85\textwidth
中,以及内部 xseps 的两倍将被减去。(准确地说,我只是构建了一个值table+/.list
width("…")
.85\textwidth-width("le monde")-2*\pgfkeysvalueof{/pgf/inner xsep}-
⋮
-width("southern echo")-2*\pgfkeysvalueof{/pgf/inner xsep}
实际评估是由 PGFmath 在矩阵构建的某个深处完成的。
(如果包含比默认值更复杂的值,则可能需要()
进行计算。)\pgfkeysvalueof{…}
.3333em
我已经添加
every outer matrix/.append style={inner sep=+0pt, outer sep=+0pt}
以便实际矩阵尽可能紧密因为矩阵本身有自己的内部(和外部)sep。
我还将向下移动改为2cm
在画布坐标系中(而不是坐标坐标系)因为您只处理实际长度。
第二个框架由两个独立的矩阵构建,这两个矩阵的外边框.85\textwidth
彼此不同。这样可以更轻松地创建具有不同列数的矩阵,而无需在拆分之前确定哪一个是列。
输出略有不同,但我认为这是由于长度和距离计算不精确造成的。
代码
\documentclass{beamer}
\geometry{verbose,papersize={160mm,100mm}}
\usepackage{tikz}
\usetikzlibrary{matrix}
\tikzset{
allmatrix/.style = {matrix of nodes, rounded corners = 1mm,
nodes in empty cells, matrix anchor=#1,
every outer matrix/.append style={inner sep=+0pt, outer sep=+0pt},
row sep=-\pgflinewidth, column sep=-\pgflinewidth,
ampersand replacement=\&, nodes={outer sep=0pt},
text height=1.5ex, text depth=.25ex},
table/.style args= {#1/#2}{
column #1/.append style={nodes={align=left, text width=#2}}},
table+/.style args= {#1/#2}{
column #1/.append style={nodes={align=left, text width=#2}},
user1850133 column sep/.append={-#2-2*\pgfkeysvalueof{/pgf/inner xsep}}}}
\begin{document}
\begin{frame}
\begin{tikzpicture}[overlay,remember picture]
\matrix at (current page.north)
[shift={(0,-2cm)}, allmatrix=north, nodes={draw},
column 2/.append style={column sep=\pgfkeysvalueof{/tikz/user1850133 column sep}},
user1850133 column sep/.initial=.85\textwidth,
table+/.list={1/width("le monde"),
2/width("new york times"),
3/width("penpavar"),
4/width("southern echo")}] (near)
{
le monde \& new york times \& le figaro \& southern echo\\
innadu \& le maine \& penpavar \& the hindu \\
times \& spectrum \& science \& nature \\
};
\end{tikzpicture}
\end{frame}
\begin{frame}
\begin{tikzpicture}[overlay,remember picture]
\matrix at (current page.north)
[shift={(-.5*.85\textwidth,-2cm)}, allmatrix=north west, nodes={draw},
table/.list={1/width("le monde"),
2/width("new york times"),
3/width("penpavar"),
4/width("southern echo")}] (near-l)
{
le monde \& new york times\\
innadu \& le maine \\
times \& spectrum \\
};
\matrix at (current page.north)
[shift={(.5*.85\textwidth,-2cm)}, allmatrix=north east, nodes={draw},
table/.list={1/width("penpavar"),
2/width("southern echo")}] (near-r)
{
le figaro \& southern echo\\
penpavar \& the hindu \\
science \& nature \\
};
\end{tikzpicture}
\end{frame}
\end{document}
输出
答案2
像这样吗?
\documentclass{beamer}
\newlength{\slw}\setlength{\slw}{160mm}
\newlength{\slh}\setlength{\slh}{100mm}
\geometry{verbose,papersize={\slw,\slh}}
\usepackage{tikz,calc,xfp}
\usetikzlibrary{calc,matrix}
\tikzset{
allmatrix/.style = {matrix of nodes, rounded corners = 1mm,
nodes in empty cells,matrix anchor=#1,
row sep=-\pgflinewidth, column sep=-\pgflinewidth,
ampersand replacement=\&, nodes={outer sep=0pt},
text height=1.5ex, text depth=.25ex},
}
\begin{document}
\begin{frame}
\begin{tikzpicture}[overlay,remember picture]
\matrix at (current page.north)
[shift={(0,-2)}, allmatrix=north, column 1/.append style={nodes={align=left,draw,
text width={width("le monde")},
}},
column 2/.append style={nodes={align=left,draw,
text width={width("new york times")},
}},
column 3/.append style={nodes={align=left,text width={.08\paperwidth},
}},
column 4/.append style={nodes={align=left,draw,
text width={width("penpavar")},
}},
column 5/.append style={nodes={align=left,draw,
text width={width("southern echo")},
}}] (mytab)
% table/.list={1/width("le monde"),
% 2/width("new york times"),
% 4/width("le figaro"),
% 5/width("southern echo")}] (near)
{
le monde \& new york times \& \& le figaro \& southern echo\\
innadu \& le maine \& \& penpavar \& the hindu \\
times \& spectrum \& \& science \& nature \\
};
\end{tikzpicture}
\end{frame}
\end{document}
答案3
只是一个建议。由于 OP 使用绝对定位,我认为放置两个独立矩阵比计算列之间的距离更容易。这是我使用 CarLaTeX 代码的方法的代码。
\documentclass{beamer}
\usepackage{tikz,calc,xfp}
\usetikzlibrary{calc,matrix}
\tikzset{
allmatrix/.style = {matrix of nodes, rounded corners = 1mm,
nodes in empty cells,matrix anchor=#1,
row sep=-\pgflinewidth, column sep=-\pgflinewidth,
ampersand replacement=\&, nodes={outer sep=0pt},
text height=1.5ex, text depth=.25ex},
nodes={align=left, draw}
}
\begin{document}
\begin{frame}
\begin{tikzpicture}[overlay,remember picture]
\matrix at (current page.north west)
[shift={(1.5,-2)}, allmatrix=north west, draw=none,
column 1/.append style={nodes={text width={width("le monde")}}},
column 2/.append style={nodes={text width={width("new york times")}}}]
(mytab1)
{
le monde \& new york times\\
innadu \& le maine\\
times \& spectrum\\
};
\matrix at (current page.north east)
[shift={(-1.5,-2)}, allmatrix=north east, draw=none,
column 1/.append style={nodes={text width={width("penpavar")}}},
column 2/.append style={nodes={text width={width("southern echo")}}}]
(mytab2)
{
le figaro \& southern echo\\
penpavar \& the hindu \\
science \& nature \\
};
\end{tikzpicture}
\end{frame}
\end{document}