介绍
我用 TikZ 创建了一个简单的公交时刻表:
目前,节点放置是手动完成的。
问题
我想创建一个大致如下的环境:
\begin{timetable} % optional argument could be [6-21]
\direction{Sutjeska to Nahorevo:}{6:30,7:15,8:00,9:00}[2em]
\end{timetable}
它会:
- 绘制所需的时间 - 首次启动时间和最后一次启动时间分别向上舍入 -1 和向上舍入 +1(此示例中为 6-10)
- 如果给出了可选参数,则开始时间和结束时间由参数给出
- 在适当的位置绘制列表中给出的时间(因此 7:15 是
at ($(hour7)!0.25!(hour8)$)
yshift
方向标题和时间按给定的金额\direction{<direction title>}{<timetable>}[<amount>]
我想知道
我如何拆分<timetable>
参数并将其存储到某个列表中。然后我可能可以搜索最小值、最大值并计算时间表上放置时间的适当位置。
答案1
您可以使用 PGF/TikZ 宏\foreach
来循环遍历逗号分隔的列表。冒号可以通过具有特定参数文本的宏进行拆分,如下所示:
\documentclass{article}
\usepackage{tikz}
\begin{document}
\def\splitcolon#1:#2\relax{%
% #1 : hour
% #2 : minutes
% Do something with them, e.g. store them in macros.
\def\hour{#1}%
\def\minutes{#2}%
}
\newcommand{\direction}[2]{%
\foreach \v in {#2} {%
% expand \v so that it can be split at the colon:
\expandafter\splitcolon\v\relax
% use the values as you wish:
(\hour)(\minutes)\\ % dummy example
}%
}
\direction{Sutjeska to Nahorevo:}{6:30,7:15,8:00,9:00}
\end{document}
答案2
TeX 允许几乎无限多种数据结构,但它为您留下了操作它们的方法。
例如这个对象:
\timetable{Nahorevo}{Sutjeska}{12:50,14:45,15:35,16:25}
保存从纳赫罗雷沃到苏捷斯卡的路线信息,是一个包含两个“字符串”和一个“列表”的“对象”。
最有用的数据结构是列表,我个人倾向于使用内置的 LaTeX 例程来操作列表。
我们首先定义一个宏来保存路线的信息:
\def\route#1#2#3{%
\expandafter\def\csname#1#2\endcsname{#1 to #2}
\expandafter\def\csname#1#2times\endcsname{#3}
}
然后我们定义一个宏来循环信息并打印时间表。
\def\timetable#1#2#3{%
\route{#1}{#2}{#3}
\def\XX{\csname#1#2times\endcsname}
\csname#1#2\endcsname\par
\@for \i:=\XX \do{%
\i,
}
}
然后我们可以这样调用这两条路线:
\timetable{Sutjeska}{Nahorevo}{6:30,7:15,8:00,9:00}\par
\timetable{Nahorevo}{Sutjeska}{12:50,14:45,15:35,16:25}
我为路线创建命令的原因是,如果有人对 Sutjeska->Nahorevo 路线有算法,那么 Nahorevo->Sutjeska 就可以自动确定,因此从长远来看,创建命令可以为您提供更大的灵活性。
完整的极简图如下所示,
\documentclass{article}
\begin{document}
\makeatletter
\def\route#1#2#3{%
\expandafter\def\csname#1#2\endcsname{#1 to #2}
\expandafter\def\csname#1#2times\endcsname{#3}
}
\def\timetable#1#2#3{%
\route{#1}{#2}{#3}
\def\XX{\csname#1#2times\endcsname}
\csname#1#2\endcsname\par
\@for \i:=\XX \do{%
\i,
}
}
\timetable{Sutjeska}{Nahorevo}{6:30,7:15,8:00,9:00}\par
\timetable{Nahorevo}{Sutjeska}{12:50,14:45,15:35,16:25}
\makeatother
\end{document}