我在这里问了类似的问题跨越多页的彩色花括号但可能是我没有提供足够的细节。就其本身而言,这个解决方案非常有效。
我的文档中有大约 32 个 longtable,行数从 40 到 250 不等。之所以选择 longtable,是因为我希望我的数据在列中,这样可以很好地对齐和换行。每个 longtable 的开头都有节和子节。到目前为止,生活还不错。这就是我变得有点贪婪的地方。
我想在左侧显示花括号或方括号,这些括号需要跨页,并且可以从一个表开始并终止于下一个表的任意位置。有些括号需要跨越大约 5 或 6 个长表。
我曾想过使用 tikz 覆盖,但找不到任何示例来说明如何跨页面跨越括号。我附上了一个在 word 中创建的示例图像,以更好地解释这种需要。在所附图像中,棕色垂直线和水平线是 MS word 屏幕截图的遗留,确实属于 tex 解决方案的一部分。
任何示例、帮助或文档都将不胜感激。
答案1
更新 2
很好安德鲁·史黛西的大家最喜欢的 TikZ 库tikzmark
这稍微简单一点。
你需要下载文件tikzmark.dtx
并通过 运行它pdflatex
。如果它请求和_example
文件,请忽略。您将获得两个文件tikzlibrarytikzmark.code.tex
和tikzlibrarytikzmarkextras.code.tex
。将它们放在工作文件的目录中.tex
或本地texmf
树中。使用 加载它\usetikzlibrary{tikzmark}
。
我个人不太喜欢这个支架的风格,也许我重新添加我自己的风格。
操作说明
\bracestart{<identifier>}
将括号的起始和结束位置放在某处\braceend{<identifier>}
。在括号应该出现的每一页上,您都必须添加
\bracedraw[<brace>]{<identifier>}{<level>}{<node [] argument>}{<node text>}
将<brace>
用于内部支撑\draw
。
此时,支具的乳头中间部分位于支具的一半处。
去做
- 自动重新替换中间部分及其文本。
- 检测左侧或右侧位置(针对
twoside
具有不同边距的文档) - 更好地与
pgf
的密钥管理进行互操作(所有变量都是 TeX 命令) - …
代码
\documentclass{article}
\usepackage{tikz}
\usetikzlibrary{calc,arrows,tikzmark,decorations.pathreplacing}
\tikzset{
next page=below,
mymarginbrace/.style={
decorate,
decoration={
brace,
amplitude=3em,
aspect=.5
},
thick,
rounded corners=10pt
}
}
\newcommand*{\tikzbracemargindistance}{12.5em} % probably should be some \marginwidth stuff and should handle even/odd pages (twoside)
\newcommand*{\tikzbraceleveldistance}{3em}
\newcommand*{\tikzbracestartheight}{1.5ex}
\newcommand*{\tikzbraceendheight}{\baselineskip-.5ex} % \tikzmark lands in the following par so we cheat ;)
\newcommand*{\tikzbracestartlength}{1.5em}
\newcommand{\bracestart}[1]{% #1 = name
\tikzmark{bracestart-#1}
}
\newcommand{\braceend}[1]{% #1 = name
\tikzmark{braceend-#1}
}
\newcommand{\bracedraw}[5][]{% #1 = optional argument for the brace line
% #2 = name
% #3 = level
% #4 = (mandatory) node argument
% #5 = node text
\tikz[overlay, remember picture] {
\draw[mymarginbrace, #1]
% (pic cs:braceend-#2) -- node[#4] {#5} (pic cs:bracestart-#2);
(perpendicular cs:
horizontal line through = {(pic cs:braceend-#2)},
vertical line through = {($(current page.west)+(\tikzbracemargindistance-#3*\tikzbraceleveldistance,0pt)$)})
-- node[sloped,above=2.5em, #4] {#5}
(perpendicular cs: horizontal line through = {($(pic cs:bracestart-#2)+(0,\tikzbracestartheight)$)}, vertical line through = {($(current page.west)+(\tikzbracemargindistance-#3*\tikzbraceleveldistance,0pt)$)})
;
}
}
\usepackage{lipsum}
\begin{document}
\lipsum[1-4]
\bracestart{a}
\bracedraw[]{a}{0}{}{Hallo! Text a} % start of a = draw
\lipsum*[5-6]
\braceend{a}
\bracedraw[]{a}{0}{}{Hallo! Text a} % end of a = draw
%
\lipsum[7-9]
\bracestart{b}
\bracedraw[]{b}{1}{}{Text b} % start of b = draw
\lipsum[10-11]
\bracestart{c}
\bracedraw[]{c}{0}{}{Text c} % start of c = draw
\bracedraw[]{b}{1}{}{Text b} % somewhere bet start and end of b but certainly on another page than start and end
%
\bracedraw[green]{d}{2}{}{Text d} % start and end only on one page ...
\bracestart{d}
\lipsum*[12]
\braceend{d}
\lipsum*[13-17]
\braceend{c}
\braceend{b}
\bracedraw[]{c}{0}{}{Text c} % end of c = draw
\bracedraw[]{b}{1}{}{Text b} % end of b = draw
\end{document}
输出
第一稿
我想到以下一些事情[没有 MWE:(
并且我还没有看过你链接的问题]。
牙套的问题在于计算“乳头”部分的中心位置。
代码
\documentclass{article}
\usepackage{tikz}
\usetikzlibrary{calc,arrows}
\newcommand{\tikzmark}[3][]{\tikz[overlay,remember picture] \node[#1] (#2) at (#3) {};}
\usepackage{lipsum}
\begin{document}
\lipsum[1-4]
\tikzmark{up}{$(0,0)+(-2em,0)$}
\tikzmark{pageup}{$(current page.south west)+(4em,0em)$}
\tikz[overlay,remember picture] \draw[very thick] (up) to[out=180,in=95] node [sloped,midway,above] {Where do we go?} (pageup);
\lipsum[5-6]
\tikzmark{down}{$(0,0)+(-2em,0)$}
\tikzmark{pagedown}{$(current page.north west)+(4em,0em)$}
\tikz[overlay,remember picture] \draw[-latex,very thick] (pagedown) to[out=-85,in=180] node [above,sloped,pos=.8] {Whee!} (down);
\lipsum[7-9]
\end{document}