我正在使用该tikz-timing
软件包创建时间线,因为chronosys
和chronology
不配合,而且功能太有限、太过时,不符合我的目的,moderntimeline
不幸的是无法以水平线性格式显示。(我试图创建的时间线相当复杂,而时间线软件包的选择极其有限。)
一切都进行得相当顺利,考虑到我最近才开始使用 LaTeX(在对 Lilypond 有一些有限的经验之后)来创建这个时间线,除了打字[white, timing/D/background/.style={fill=orange}]
占用了大量的空间(和时间),这非常不方便并且使代码看起来非常混乱。
我尝试过使用\newcommand
(我听说\def
基本上只是它的一个劣质版本),但到目前为止,编译器不喜欢我以这种方式使用它,因为我没有定义实际的命令,只是一个替换。
我原本拥有的是
\newcommand{\efill}[1]{timing/D/background/.style={fill=#1}}
我以为这样我就可以输入[\efill {blue}]
将填充设置为蓝色。由于这是一个缩写而不是命令,因此它并没有按照我预期的方式工作。
理想的解决方案将允许定义字符到颜色的同义词(因此,我只需输入单个字符的名称,而不是输入整个颜色名称),以及定义自定义的封闭符号(例如,{{ob}}
在编译期间扩展为[orange, timing/D/background/.style={fill=blue}]
.
我怎样才能实现这个目标?
以下是我对 MWE 的新手尝试:
\documentclass{article} \usepackage{tikz, tikz-timing} \begin{document} \Huge \begin{tikztimingtable} {\LARGE{Benjy}} & [blue, timing/D/background/.style={fill=none}]DDDD;[orange,timing/D/background/.style={fill=green}]DDDD \\ \begin{extracode} \tableheader {\begin{Large}Character\end{Large}} {\begin{LARGE}\textbf{Events}\end{LARGE}} \tablerules \fulltablegrid \end{extracode} \end{tikztimingtable} \end{document}
我不确定我是否正确标记了它,因此请随意添加/删除标签。
答案1
我希望我正确理解了你的问题。
我定义了一个新的 TikZ 样式efill
,它接受两个参数。
#1
是绘制颜色#2
是填充颜色
然后可以使用类似的风格
efill={draw color}{fill color}
为了实现所要求的缩写b -> blue
等,我使用了\colorlet
类似
\colorlet{b}{blue}
执行
\documentclass{article}
\pagestyle{empty}% for cropping
\usepackage{tikz,tikz-timing}
\colorlet{b}{blue}
\colorlet{o}{orange}
\colorlet{g}{green}
\tikzset{
efill/.style n args={2}{
#1,timing/D/background/.style={fill=#2}
}
}
\begin{document}
\Huge
\begin{tikztimingtable}
{\LARGE Benjy} & [efill={b}{none}]DDDD;[efill={o}{g}]DDDD \\
\begin{extracode}
\tableheader
{\Large Character}
{\LARGE\textbf{Events}}
\tablerules
\fulltablegrid
\end{extracode}
\end{tikztimingtable}
\end{document}
输出
从这里开始使用一些小技巧(TikZ 风格的论据) 您还可以单独设置绘制和填充颜色,并为它们指定默认值。在此示例中,默认值为draw=black,fill=none
。
\documentclass{article}
\pagestyle{empty}% for cropping
\usepackage{tikz,tikz-timing}
\colorlet{b}{blue}
\colorlet{o}{orange}
\colorlet{g}{green}
\tikzset{
set efill/.code={\pgfqkeys{/tikz/efill}{#1}},
set efill={draw/.initial=black, fill/.initial=none},
efill/.style={
set efill={#1},
\pgfkeysvalueof{/tikz/efill/draw},timing/D/background/.style={fill=\pgfkeysvalueof{/tikz/efill/fill}}
}
}
\begin{document}
\Huge
\begin{tikztimingtable}
{\LARGE Benjy} & [efill={fill=b}]DDDD;[efill={draw=o,fill=g}]DDDD \\
\begin{extracode}
\tableheader
{\Large Character}
{\LARGE\textbf{Events}}
\tablerules
\fulltablegrid
\end{extracode}
\end{tikztimingtable}
\end{document}