Einfärben von longtable-Zeilen per Makro

Einfärben von longtable-Zeilen per Makro

kommt von hier:vorheriger Thread, ich konzentriere mich auf eine Frage und stelle ein MVE bereit. Mein Problem ist: Ich möchte Zeilen in einer Longtable über ein Makro mit derselben Farbe einfärben, um zwischen zwei verschiedenen Builds zu unterscheiden, die von außen ausgelöst werden (interne und öffentliche Version). Wenn ich dies über Rowcolor mache, wird nur die erste Zeile eingefärbt, die anderen bleiben in der Standardhintergrundfarbe. Ich könnte den Befehl für jede Zeile verwenden, möchte jedoch nur einen Befehl haben.

Danke.

Der MWE beträgt:

\documentclass[a4paper,11pt,index=totoc]{scrreprt}

% --- out of style file

% \def\isRelease{1}

\usepackage{colortbl} 
\usepackage{array}
\usepackage{longtable}
\usepackage{booktabs}
\usepackage[justification=centering,font=scriptsize,labelfont=bf,position=bottom]{caption}
\usepackage{xifthen} 
\usepackage{color}

\newcommand{\headcol}{\rowcolor{black}}
\newcommand{\internCol}{\rowcolor{yellow}}

\newcommand{\startLongTable}%
{%
  \renewcommand{\arraystretch}{1.2}%
  \setlength\LTleft{0pt plus \textwidth}%
  \setlength\LTright{0pt plus \textwidth}%
}

\newcommand{\tableRowEnd}%
{%
\\ \midrule%
}

\newcommand{\lastTableRowEnd}%
{%
\\ \addlinespace%
}

\newcommand{\preTableHeaderLine}{\arrayrulecolor{black}\specialrule{\heavyrulewidth}{\abovetopsep}{0pt}%
            \arrayrulecolor{black}\specialrule{\belowrulesep}{0pt}{0pt}%
            \arrayrulecolor{black}}
\newcommand{\postTableHeaderLine}{\arrayrulecolor{black}\specialrule{\aboverulesep}{0pt}{0pt}%
            \arrayrulecolor{black}\specialrule{\lightrulewidth}{0pt}{0pt}%
            \arrayrulecolor{black}}

\newcommand{\tableIntern}[2]%
{%
  \ifdefined\isRelease%
    #1%
  \else%
    \tableRowEnd%
    \internCol#2%
  \fi%
}

% --- --------------------------

\begin{document}

\startLongTable
\begin{longtable}{ >{\centering}p{0.1\textwidth-2\tabcolsep} 
                                p{0.2\textwidth-2\tabcolsep} 
                                p{0.4\textwidth-2\tabcolsep} 
                   >{\centering}p{0.2\textwidth-2\tabcolsep}
    >{\centering\arraybackslash}p{0.1\textwidth-2\tabcolsep}
                 }
\preTableHeaderLine
\headcol \color{white} Field & \color{white} Name & \color{white} Description & \color{white} Format & \color{white} \# \\
\postTableHeaderLine \addlinespace
\endhead
1 & Field1 & Name1 & A & 2 \tableRowEnd
2 & Field2 & Name2 & B & 3
\tableIntern{\lastTableRowEnd}
{
3 & Field3 & Name3 & C & 3 \tableRowEnd
4 & Field4 & Name4 & C & 4 \lastTableRowEnd
}
\bottomrule
\caption{stackoverflow MWE}
\label{table:stackoverflowMWE}
\end{longtable}


\end{document}

Bildbeschreibung hier eingeben

Antwort1

xcolorSie können mit der Option [table]statt laden colortbl: Dadurch wird Letzteres um einen \rowcolors{no of 1st coloured row}{odd rows colour}{even rows colour}Befehl erweitert, der das Gewünschte tut, wenn Sie für gerade und ungerade Zeilen die gleiche Farbe wählen.

Nur eine Anmerkung am Rande: Ich finde, dass die horizontalen Linien zwischen den farbigen Zeilen nicht sehr schön aussehen. Sie können sie auch durch ersetzen \addlinespace. Wenn Sie horizontale Linien ohne die weißen Streifen möchten, können Sie außerdem \above/belowrulesepauf setzen 0ptund mit dem Paket etwas (farbige) Polsterung hinzufügen cellspace. Letzter Punkt: Meiner Meinung nach sind die weißen Spaltenköpfe auf schwarzem Hintergrund mit einer fetten Schriftart besser lesbar.

\documentclass[a4paper,11pt,index=totoc]{scrreprt}

% --- out of style file

% \def\isRelease{1}

\usepackage[table]{xcolor}
\usepackage{array}
\usepackage{longtable}
\usepackage{booktabs}
\usepackage[justification=centering,font=scriptsize,labelfont=bf,position=bottom]{caption}
\usepackage{xifthen}

\newcommand{\headcol}{\rowcolor{black}}
\newcommand{\internCol}{\rowcolor{yellow}}

\newcommand{\startLongTable}%
{%
  \renewcommand{\arraystretch}{1.2}%
  \setlength\LTleft{0pt plus \textwidth}%
  \setlength\LTright{0pt plus \textwidth}%
}

\newcommand{\tableRowEnd}%
{%
\\ \midrule%
}

\newcommand{\lastTableRowEnd}%
{%
\\ \addlinespace%
}

\newcommand{\preTableHeaderLine}{\arrayrulecolor{black}\specialrule{\heavyrulewidth}{\abovetopsep}{0pt}%
            \arrayrulecolor{black}\specialrule{\belowrulesep}{0pt}{0pt}%
            \arrayrulecolor{black}}
\newcommand{\postTableHeaderLine}{\arrayrulecolor{black}\specialrule{\aboverulesep}{0pt}{0pt}%
            \arrayrulecolor{black}\specialrule{\lightrulewidth}{0pt}{0pt}%
            \arrayrulecolor{black}}

\newcommand{\tableIntern}[2]%
{%
  \ifdefined\isRelease%
    #1%
  \else%
    \tableRowEnd%
    \internCol#2%
  \fi%
}

% --- --------------------------

\begin{document}

\startLongTable\rowcolors{2}{yellow}{yellow}
\begin{longtable}{ >{\centering}p{0.1\textwidth-2\tabcolsep}
                                p{0.2\textwidth-2\tabcolsep}
                                p{0.4\textwidth-2\tabcolsep}
                   >{\centering}p{0.2\textwidth-2\tabcolsep}
    >{\centering\arraybackslash}p{0.1\textwidth-2\tabcolsep}
                 }
\preTableHeaderLine
\headcol \color{white}\bfseries Field & \color{white}\bfseries Name & \color{white}\bfseries Description & \color{white}\bfseries Format & \color{white}\bfseries \# \\
\postTableHeaderLine \addlinespace
\endhead
1 & Field1 & Name1 & A & 2 \tableRowEnd
2 & Field2 & Name2 & B & 3
\tableIntern{\lastTableRowEnd}
{
3 & Field3 & Name3 & C & 3 \tableRowEnd
4 & Field4 & Name4 & C & 4 \lastTableRowEnd
}
\hiderowcolors
\bottomrule
\caption{stackoverflow MWE}
\label{table:stackoverflowMWE}
\end{longtable}

\end{document} 

Bildbeschreibung hier eingeben

Bearbeiten:

Ein weiterer Code, der mit den Schaltern \showRowcolorsund \hideRowcolorsspielt, um die Zeilenfärbung zu aktivieren und zu deaktivieren:

\documentclass[a4paper,11pt,index=totoc]{scrreprt}
    % --- out of style file

    % \def\isRelease{1}

    \usepackage[table]{xcolor}
    \usepackage{array}
    \usepackage{longtable}
    \usepackage{booktabs}
    \usepackage[justification=centering,font=scriptsize,labelfont=bf,position=bottom]{caption}
    \usepackage{xifthen}

    \newcommand{\headcol}{\rowcolor{black}}
    \newcommand{\internCol}{\rowcolor{yellow}}

    \newcommand{\startLongTable}%
    {%
      \renewcommand{\arraystretch}{1.2}%
      \setlength\LTleft{0pt plus \textwidth}%
      \setlength\LTright{0pt plus \textwidth}%
    }

    \newcommand{\tableRowEnd}%
    {%
    \\ \midrule%
    }

    \newcommand{\lastTableRowEnd}%
    {%
    \\ \addlinespace%
    }

    \newcommand{\preTableHeaderLine}{\arrayrulecolor{black}\specialrule{\heavyrulewidth}{\abovetopsep}{0pt}%
\specialrule{\belowrulesep}{0pt}{0pt}%
}
    \newcommand{\postTableHeaderLine}{\arrayrulecolor{black}\specialrule{\aboverulesep}{0pt}{0pt}%
                \specialrule{\lightrulewidth}{0pt}{0pt}%
                }

    \newcommand{\tableIntern}[2]%
    {%
      \ifdefined\isRelease%
        #1%
      \else%
        \tableRowEnd%
        \internCol#2%
      \fi%
    }

    % --- --------------------------

    \begin{document}
    \startLongTable\rowcolors{2}{yellow}{yellow}
    \begin{longtable}{ >{\centering}p{0.1\textwidth-2\tabcolsep}
                                    p{0.2\textwidth-2\tabcolsep}
                                    p{0.4\textwidth-2\tabcolsep}
                       >{\centering}p{0.2\textwidth-2\tabcolsep}
        >{\centering\arraybackslash}p{0.1\textwidth-2\tabcolsep}
                     }
    \preTableHeaderLine
    \headcol \color{white}\bfseries Field & \color{white}\bfseries Name & \color{white}\bfseries Description & \color{white}\bfseries Format & \color{white}\bfseries \# \\
    \postTableHeaderLine% \addlinespace
    \endhead
    \hiderowcolors 1 & Field1 & Name1 & A & 2 \tableRowEnd
    2 & Field2 & Name2 & B & 3
    \tableIntern{\lastTableRowEnd}
    {
    3 & Field3 & Name3 & C & 3 \tableRowEnd
    4 & Field4 & Name4 & C & 4 \tableRowEnd
    }
    \hiderowcolors 5 & Field5 & Name5 & D & 2 \tableRowEnd
    \showrowcolors 6 & Field6 & Name6 & E & 3\lastTableRowEnd
        \hiderowcolors
    \bottomrule
    \caption{stackoverflow MWE}
    \label{table:stackoverflowMWE}
    \end{longtable}

    \end{document} 

Bildbeschreibung hier eingeben

Antwort2

Ich würde keine tabellarischen Zeilen in ein Argument einfügen. Das ist ziemlich instabil. Ich würde eine Syntax wie \startrelease... verwenden \stoprelease.

Abgesehen davon: Wenn Ihr \tableInternTeil mit einem anderen Zeilenbefehl endet, könnte so etwas funktionieren:

\documentclass[a4paper,11pt,index=totoc]{scrreprt}

% --- out of style file

% \def\isRelease{1}

\usepackage{colortbl}
\usepackage{array}
\usepackage{longtable}
\usepackage{booktabs}
\usepackage[justification=centering,font=scriptsize,labelfont=bf,position=bottom]{caption}
\usepackage{xifthen}
\usepackage{color}

\newcommand{\headcol}{\rowcolor{black}}
\newcommand{\internCol}{\rowcolor{yellow}}

\newcommand{\startLongTable}%
{%
  \renewcommand{\arraystretch}{1.2}%
  \setlength\LTleft{0pt plus \textwidth}%
  \setlength\LTright{0pt plus \textwidth}%
}

\newcommand{\tableRowEnd}%
{%
\\ \midrule%
}

\newcommand{\lastTableRowEnd}%
{%
\\ \addlinespace%
}

\newcommand{\preTableHeaderLine}{\arrayrulecolor{black}\specialrule{\heavyrulewidth}{\abovetopsep}{0pt}%
            \arrayrulecolor{black}\specialrule{\belowrulesep}{0pt}{0pt}%
            \arrayrulecolor{black}}
\newcommand{\postTableHeaderLine}{\arrayrulecolor{black}\specialrule{\aboverulesep}{0pt}{0pt}%
            \arrayrulecolor{black}\specialrule{\lightrulewidth}{0pt}{0pt}%
            \arrayrulecolor{black}}

\newcommand{\tableIntern}[2]%
{%
  \ifdefined\isRelease%
    #1%
  \else%
    \gdef \tableRowEnd{\\\midrule\internCol}%
    \gdef \lastTableRowEnd{\gdef\tableRowEnd{\\\midrule}\\\addlinespace}%
    \tableRowEnd%
    \internCol#2%
  \fi%
}

% --- --------------------------

\begin{document}

\startLongTable
\begin{longtable}{ >{\centering}p{0.1\textwidth-2\tabcolsep}
                                p{0.2\textwidth-2\tabcolsep}
                                p{0.4\textwidth-2\tabcolsep}
                   >{\centering}p{0.2\textwidth-2\tabcolsep}
    >{\centering\arraybackslash}p{0.1\textwidth-2\tabcolsep}
                 }
\preTableHeaderLine
\headcol \color{white} Field & \color{white} Name & \color{white} Description & \color{white} Format & \color{white} \# \\
\postTableHeaderLine \addlinespace
\endhead
1 & Field1 & Name1 & A & 2 \tableRowEnd
2 & Field2 & Name2 & B & 3
\tableIntern{\lastTableRowEnd}
{
3 & Field3 & Name3 & C & 3 \tableRowEnd
4 & Field4 & Name4 & C & 4 \lastTableRowEnd
}
5 & text & Name3 & C & 3 \tableRowEnd
6 & test\\
\bottomrule
\caption{stackoverflow MWE}
\label{table:stackoverflowMWE}
\end{longtable}


\end{document}

Antwort3

Eine Idee ist, eine „Phantom-Extraspalte“ zu erstellen und darin einen leeren Multirow-Befehl mit nur der Zeilenfarbe einzugeben. Wenn Sie Schwierigkeiten haben, bitten Sie mich um Hilfe. (Ich habe es ein bisschen versucht, aber es ist ein bisschen kompliziert, es in Ihren Code zu bekommen.) Ich denke, Sie können es sehr einfach machen (Sie wissen bereits, wie Ihr Code funktioniert).

verwandte Informationen