不使用 CSV 如何处理具有许多参数的表记录?

不使用 CSV 如何处理具有许多参数的表记录?

我有以下情况:我收到这样的记录

\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}

并得到这个:

在此处输入图片描述

当然,您也可以将所有\rows 放在外部文件中,然后将\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”值,我必须用括号将其括起来以进行转义。生成这些行的程序也应该这样做,或者避免在字符串中使用逗号。

相关内容