将自定义宏的参数拆分为列表

将自定义宏的参数拆分为列表

介绍

我用 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}

相关内容