我有以下情况:我收到这样的记录
\row{day,dayShort,date}{come,go,break,breakGo}{hours,days}{project}
来自外部程序。该程序提交 30 或 40 条记录,然后我必须使用 longtable 在 LaTex 中创建时间表。我认为这就像一位用户所说的那样,不是很有用,但这是我获取数据的方式。
我已经找到了一种使用 csv 的方法,但对我们来说这并不是一个完美的方法。
我也尝试过类似的事情,但我无法手写每一条记录,因为我不知道我会得到多少条记录:
\documentclass[10pt,a4paper]{article}
\usepackage[ngerman]{babel}
\usepackage{longtable}
\newcommand*{\FormDay}[1]{#1}
\newcommand*{\FormDayShort}[1]{#1}
\newcommand*{\FormDate}[1]{#1}
\newcommand*{\FormType}[1]{#1}
\newcommand*{\FormCome}[1]{#1}
\newcommand*{\FormGo}[1]{#1}
\newcommand*{\FormBreak}[1]{#1}
\newcommand*{\FormBreakGo}[1]{#1}
\newcommand*{\FormHours}[1]{#1}
\newcommand*{\FormDays}[1]{#1}
\newcommand*{\FormProject}[1]{#1}
\newenvironment{timesheet}
{\begin{longtable}
{@{}p{0.075\textwidth}p{0.125\textwidth}p{0.075\textwidth}p{0.1\textwidth}p{0.1\textwidth}p{0.075\textwidth}p{0.075\textwidth}p{0.15\textwidth}}
Day & Date & Type & Come & Go & Hours & Days & Project \tabularnewline[2ex]
\FormDayShort{Di} & \FormDate {01.09.2015} & \FormType{U} &
\FormCome{08:00} & \FormGo{17:00} &
%\FormBreak{12:00} & \FormBreakGo{13:00} &
\FormHours{08,00} & \FormDays{1} & \FormProject{Airplane Hangar} \tabularnewline
\endhead
}
{
\hline
\end{longtable}
}
\begin{document}
{\huge Timesheet} \hfill
\begin{timesheet}
\end{timesheet}
\end{document}
因此,如果有人能以完全不同的方式为我提供解决方案,我将不胜感激。
提前致谢!
答案1
不确定我是否正确理解了你的问题。我猜你想在文档中输入以下内容:
{\huge Timesheet} \hfill
\begin{timesheet}
\row{Dienstag,Di,01.09.2015}{08:00,17:00,12:00,13:00}{{08,00},1}{Airplane Hangar}
\row{Mittwoch,Mi,02.09.2015}{08:30,17:30,12:00,13:00}{{08,00},1}{Spaceship Hangar}
\row{Donnerstag,Do,03.09.2015}{08:30,17:00,12:00,13:00}{{07,50},1}{Autocar Hangar}
\row{Freitag,Fr,04.09.2015}{08:15,17:15,12:00,13:00}{{08,00},1}{Airplane Hangar}
\end{timesheet}
并得到这个:
当然,您也可以将所有\row
s 放在外部文件中,然后将\input
其放在主文档中,如下所示:
\begin{timesheet}
\input{data}
\end{timesheet}
这是目标吗?如果是这样,那么以下宏可以完成任务。
首先,一个宏将逗号分隔的值列表提取到逗号分隔的宏列表中。您可以像这样调用它:\ExtractData{first,second}{\foo,\bar}
,您将得到\foo
包含first
和\bar
包含second
。这是一种用于pgffor
解析逗号分隔列表的黑客技术:
\def\ExtractData#1#2{% #1 List of values, #2 list of macros
\def\ccc{i}%
\foreach \data in {#1} {% We create auxilar macros called \auxi, \auxii, \auxiii...
\expandafter\xdef\csname aux\ccc\endcsname{\data}%
\xdef\ccc{\ccc i}%
}%
\xdef\ccc{i}%
\foreach \macro in {#2} {% And then store them into the provided macros
\expandafter\xdef\macro{\csname aux\ccc\endcsname}%
\xdef\ccc{\ccc i}%
}%
}
现在,使用上面的宏,\row
很容易定义:
\def\row#1#2#3#4{%
\ExtractData{#1}{\formday,\formdayshort,\formdate}%
\ExtractData{#2}{\formcome,\formgo,\formbreak,\formbreakgo}%
\ExtractData{#3}{\formhours,\formdays}%
\ExtractData{#4}{\formproject}%
\FormDayShort{\formdayshort} & \FormDate{\formdate} & \FormType{U} &
\FormCome{\formcome} & \FormGo{\formgo} &
%\formBreak{\formbreak} & \FormBreakGo{\formbreakgo} &
\FormHours{\formhours} & \FormDays{\formdays} & \FormProject{\formproject}
\tabularnewline
}
如您所见,我们首先从行参数中提取数据并将其存储到适当(小写)命名的宏中。然后我们使用这些宏为表生成一行,利用您的(驼峰式)宏来格式化每个条目。虽然不确定您为什么定义这些,但我决定保留它们。
完整的代码(生成开头粘贴的表格)如下:
\documentclass[10pt,a4paper]{article}
\usepackage[ngerman]{babel}
\usepackage{longtable}
\usepackage{pgffor}
\def\ExtractData#1#2{% #1 List of values, #2 list of macros
\def\ccc{i}%
\foreach \data in {#1} {% We create auxilar macros called \auxi, \auxii, \auxiii...
\expandafter\xdef\csname aux\ccc\endcsname{\data}%
\xdef\ccc{\ccc i}%
}%
\xdef\ccc{i}%
\foreach \macro in {#2} {% And then store them into the provided macros
\expandafter\xdef\macro{\csname aux\ccc\endcsname}%
\xdef\ccc{\ccc i}%
}%
}
\def\row#1#2#3#4{%
\ExtractData{#1}{\formday,\formdayshort,\formdate}%
\ExtractData{#2}{\formcome,\formgo,\formbreak,\formbreakgo}%
\ExtractData{#3}{\formhours,\formdays}%
\ExtractData{#4}{\formproject}%
\FormDayShort{\formdayshort} & \FormDate{\formdate} & \FormType{U} &
\FormCome{\formcome} & \FormGo{\formgo} &
%\formBreak{\formbreak} & \FormBreakGo{\formbreakgo} &
\FormHours{\formhours} & \FormDays{\formdays} & \FormProject{\formproject}
\tabularnewline
}
% Your original macros (I guess their purpose is to be able to change the formatting of the fields)
\newcommand*{\FormDay}[1]{#1}
\newcommand*{\FormDayShort}[1]{#1}
\newcommand*{\FormDate}[1]{#1}
\newcommand*{\FormType}[1]{#1}
\newcommand*{\FormCome}[1]{#1}
\newcommand*{\FormGo}[1]{#1}
\newcommand*{\FormBreak}[1]{#1}
\newcommand*{\FormBreakGo}[1]{#1}
\newcommand*{\FormHours}[1]{#1}
\newcommand*{\FormDays}[1]{#1}
\newcommand*{\FormProject}[1]{#1}
% Your original environment (whith the sample row deleted)
\newenvironment{timesheet}
{\begin{longtable}
{@{}p{0.075\textwidth}p{0.125\textwidth}p{0.075\textwidth}p{0.1\textwidth}p{0.1\textwidth}p{0.075\textwidth}p{0.075\textwidth}p{0.25\textwidth}}
Day & Date & Type & Come & Go & Hours & Days & Project \tabularnewline[2ex]
\endhead
}
{
\hline
\end{longtable}
}
% Example of usage
\begin{document}
{\huge Timesheet} \hfill
\begin{timesheet}
\row{Dienstag,Di,01.09.2015}{08:00,17:00,12:00,13:00}{{08,00},1}{Airplane Hangar}
\row{Mittwoch,Mi,02.09.2015}{08:30,17:30,12:00,13:00}{{08,00},1}{Spaceship Hangar}
\row{Donnerstag,Do,03.09.2015}{08:30,17:00,12:00,13:00}{{07,50},1}{Autocar Hangar}
\row{Freitag,Fr,04.09.2015}{08:15,17:15,12:00,13:00}{{08,00},1}{Airplane Hangar}
\end{timesheet}
\end{document}
评论
请注意,逗号分隔的值列表不能在字符串中使用逗号。您有一个08,00
“hours”值,我必须用括号将其括起来以进行转义。生成这些行的程序也应该这样做,或者避免在字符串中使用逗号。