
Das Ziel ist es, die folgende Tabelle zu erstellen, ohne alle Zeilen einzeln setzen zu müssen, sondern mit Hilfe von Schleifen, wie sie \foreach
im pgffor
Paket enthalten sind.
MWE
\documentclass{article}
\usepackage{array,booktabs,pgffor}
\newcommand{\myhrule}{\rule{1cm}{0.5pt}}
\begin{document}
%
\begin{tabular}{p{0.5cm}*{3}{>{\centering\arraybackslash}p{2cm}}}\toprule
\(i\) & \(m\) & \(P\) & \(y_{m}\) \\\midrule
1& \myhrule & \myhrule& \myhrule\\
2& \myhrule & \myhrule& \myhrule\\
3& \myhrule & \myhrule&\myhrule\\
4& \myhrule & \myhrule&\myhrule\\
5& \myhrule & \myhrule&\myhrule\\
6& \myhrule & \myhrule& \myhrule\\
7& \myhrule & \myhrule& \myhrule\\
8& \myhrule & \myhrule&\myhrule\\
9& \myhrule & \myhrule&\myhrule\\\bottomrule
\end{tabular}
\noindent
\foreach \i in {1,...,9}{\i \hspace{1cm} \myhrule \hspace{1cm} \myhrule\hspace{1cm} \myhrule \\}
%or
\noindent
\foreach \i in {1,...,9}{\i \foreach \j in {1,...,3} {\hspace{1cm} \myhrule}\\}
%
\end{document}
Antwort1
Eine einfache Lösung mit pgfplotstable
.
Ich habe mit eine Tabelle mit der gewünschten Zeilenanzahl von Grund auf neu erstellt \pgfplotstablenew
und sie dann mit angezeigt \pgfplotstabletypeset
.
Die mit festgelegten Spaltenstile \pgfplotstableset
sind vollständig anpassbar.
\documentclass{article}
\usepackage{array,booktabs,pgffor}
\newcommand{\myhrule}{\rule{1cm}{0.5pt}}
\usepackage{pgfplotstable}
\pgfplotsset{compat=1.14}
\begin{document}
%set the columns style and content
\pgfplotstableset{
create on use/new/.style={create col/expr={\pgfplotstablerow+1}},
columns/new/.style={column name={\(i\)},column type={p{0.5cm}}},
create on use/emme/.style={create col/set={\myhrule}},
columns/emme/.style={column name={\(m\)},string type, column type={>{\centering\arraybackslash}p{2cm}}},
create on use/pi/.style={create col/copy={emme}},
columns/pi/.style={column name={\(P\)},string type, column type={>{\centering\arraybackslash}p{2cm}}},
create on use/yup/.style={create col/copy={emme}},
columns/yup/.style={column name={\(y_{m}\)},string type, column type={>{\centering\arraybackslash}p{2cm}}},
}
%create a table with the desidered number of rows
\pgfplotstablenew[
columns={new, emme, pi, yup}
]{9}% <--- put here the number of rows you like
\loadedtable
%display the table
\pgfplotstabletypeset[
every last row/.style={after row=\bottomrule},
every head row/.style={before row=\toprule,after row=\midrule},
]\loadedtable
\end{document}
Antwort2
Hier ist eine LuaLaTeX-basierte Antwort. Das Paket ist nicht erforderlich pgffor
.
% !TEX TS-program = lualatex
\documentclass{article}
\usepackage{array,booktabs}
\newcolumntype{C}[1]{>{\centering\arraybackslash}p{#1}}
\newcommand{\myhrule}{\rule{1cm}{0.5pt}}
\usepackage{luacode}
\begin{luacode}
function print_line (i)
tex.sprint(i.."&\\myhrule&\\myhrule&\\myhrule\\\\")
end
\end{luacode}
\begin{document}
\begin{tabular}{@{} p{0.5cm} *{3}{C{2cm}} @{}}
\toprule
\(i\) & \(m\) & \(P\) & \(y_{m}\) \\
\midrule
\directlua{ for i = 1 , 10 do print_line ( i ) end }
\bottomrule
\end{tabular}
\end{document}
Nachtrag: Angenommen, Sie möchten den Lua-Code so verallgemeinern, dass er ausgibt J
und nicht immer 3
Kopien von &\\myhrule
vor dem Erzwingen eines Zeilenumbruchs erstellt. Angenommen J=5
, Sie müssten beispielsweise nur (a) ersetzen
function print_line (i)
tex.sprint(i.."&\\myhrule&\\myhrule&\\myhrule\\\\")
end
mit
function print_line (i,J)
tex.sprint(i)
for j=1,J do tex.sprint("&\\myhrule") end
tex.sprint("\\\\")
end
und (b) den Funktionsaufruf ändern
print_line ( i )
Zu
print_line ( i , 5)
in der Argumentation der nachfolgenden \directlua
Richtlinie im tabular
Bereich Umwelt.
Antwort3
Erste Implementierung:
\documentclass{article}
\usepackage{array,booktabs}
\usepackage{xparse}
\newcommand{\myhrule}{\rule{1cm}{0.4pt}}
\ExplSyntaxOn
\NewDocumentCommand{\makeruledtabular}{mm}
{% #1 = number of rows, #2 = header
\begin{tabular}{r w{c}{2cm} w{c}{2cm} @{}}
\toprule
#2 \\
\midrule
\int_step_function:nN {#1} \__hafid_ruledtabular_line:n
\bottomrule
\end{tabular}
}
\cs_new_protected:Nn \__hafid_ruledtabular_line:n
{
#1 & \myhrule & \myhrule \\
}
\ExplSyntaxOff
\begin{document}
\makeruledtabular{10}{\multicolumn{1}{c}{\(i\)} & \(P\) & \(y_{m}\) }
\end{document}
Allgemeinere Implementierung: Die Anzahl der Spalten wird aus der Kopfzeile bestimmt.
\documentclass{article}
\usepackage{array,booktabs}
\usepackage{xparse}
\newcommand{\myhrule}{\rule{1cm}{0.4pt}}
\ExplSyntaxOn
\NewDocumentCommand{\makeruledtabular}{mm}
{% #1 = number of rows, #2 = header
\hafid_ruledtabular:nn { #1 } { #2 }
}
\seq_new:N \l__hafid_ruledtabular_header_seq
\tl_new:N \l__hafid_ruledtabular_first_tl
\cs_new_protected:Nn \hafid_ruledtabular:nn
{
% absorb the header as a sequence
\seq_set_split:Nnn \l__hafid_ruledtabular_header_seq { & } { #2 }
% split off the first item, which should be centered
\seq_pop_left:NN \l__hafid_ruledtabular_header_seq \l__hafid_ruledtabular_first_tl
% Define the auxiliary function based on the number of items in the header
% At the end, if the header is 'A & B & C & D`, the function will be
% defined to do '#1 & \myhrule & \myhrule & \myhrule \\', where #1 stands
% for the current index in the loop
\cs_set_protected:Nx \__hafid_ruledtabular_line:n
{
##1
\prg_replicate:nn { \seq_count:N \l__hafid_ruledtabular_header_seq }
{ & \exp_not:N \myhrule }
\exp_not:N \\
}
\begin{tabular}
{
r
*{ \seq_count:N \l__hafid_ruledtabular_header_seq } { w{c}{2cm} }
@{}
}
\toprule
\multicolumn{1}{c}{\tl_use:N \l__hafid_ruledtabular_first_tl} &
\seq_use:Nn \l__hafid_ruledtabular_header_seq { & } \\
\midrule
\int_step_function:nN {#1} \__hafid_ruledtabular_line:n
\bottomrule
\end{tabular}
}
\ExplSyntaxOff
\begin{document}
\makeruledtabular{10}{\(i\) & \(P\) & \(y_{m}\) }
\bigskip
\makeruledtabular{15}{A & B & C & D}
\end{document}
Die Idee ist, dass die Schleife des Formulars ..._function:...
die gesamte Schleife ausführt, bevor irgendetwas anderes verarbeitet wird. Im Fall einer dreispaltigen Tabelle mit drei Zeilen erhalten wir also
\__hafid_ruledtabular_line:n { 1 }
\__hafid_ruledtabular_line:n { 2 }
\__hafid_ruledtabular_line:n { 3 }
und erst danach beginnt TeX mit der Verarbeitung des ersten Elements, also
1 & \myhrule & \myhrule \\
2 & \myhrule & \myhrule \\
3 & \myhrule & \myhrule \\
So entsteht der vollständige Tabellenkörper.
Antwort4
Hier erfahren Sie, wie Sie eine Tabelle mit Schleifen erstellen
\documentclass[11pt,a4paper]{article}
\usepackage[T1]{fontenc}
\usepackage[utf8]{inputenc}
\usepackage{geometry}
\geometry{top=1.8cm,bottom=3.3cm,left=0.5cm,right=0.5cm}
\usepackage{array}
\usepackage{longtable}
\usepackage{pgfplots}
\pgfplotsset{compat=1.18}
\newcommand{\emptytablerows}[2]{
\newtoks \rows{}
\def \mycount{#2}
\def \tableheading{#1}
\def \emptyrow{}
\foreach \i in {1,...,\mycount} {
\global\rows\expandafter{\expanded{\the\rows \i \expandafter & \emptyrow \\} \hline}
}
\renewcommand{\arraystretch}{1.8}
\begin{longtable}{|>{\centering\arraybackslash}m{0.5cm}|m{17cm}|}
\multicolumn{2}{l}{\textbf{\tableheading}} \\ \endhead
\hline%
\the\rows
\end{longtable}
\renewcommand{\rows}{{}}
\smallskip
}
\begin{document}
\emptytablerows{Temp}{6}
\end{document}