отсюда:бывшая тема, я фокусируюсь на одном вопросе и предоставляю MVE. Моя проблема: я хочу раскрасить строки в longtable одним и тем же цветом с помощью макроса, чтобы различать две разные сборки, запущенные извне (внутренняя и публичная версии). Делая это с помощью rowcolor, окрашивается только первая строка, остальные остаются в цвете фона по умолчанию. Я мог бы использовать команду для каждой строки, однако я хочу иметь только одну команду.
Спасибо.
МВЭ — это:
\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}
решение1
Вы можете загрузить xcolor
с опцией [table]
вместо colortbl
: она расширяет последнюю командой \rowcolors{no of 1st coloured row}{odd rows colour}{even rows colour}
, которая делает то, что вам нужно, если вы выбираете один и тот же цвет для четных и нечетных строк.
Просто комментарий в сторону: я не думаю, что горизонтальные линии между цветными рядами выглядят очень хорошо. Вы могли бы также заменить их на \addlinespace
. Также, если вы хотите горизонтальные линии без белых полос, вы можете установить \above/belowrulesep
на 0pt
и добавить некоторые (цветные) отступы с cellspace
пакетом. Последний момент: по моему мнению, белые заголовки столбцов на черном фоне более читабельны с жирным шрифтом.
\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}
Редактировать:
Еще один код, играющий с переключателями \showRowcolors
и \hideRowcolors
для активации и деактивации раскраски строк:
\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}
решение2
Я бы не стал вставлять табличные строки в аргумент. Это довольно хрупко. Я бы использовал синтаксис типа \startrelease
... \stoprelease
.
Кроме того: если ваша \tableIntern
часть заканчивается другой строкой команды, то может сработать что-то вроде этого:
\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}
решение3
Идея состоит в том, чтобы создать «фантомный дополнительный столбец» и задать пустую многострочную команду внутри него, указав только цвет строки... Если у вас возникнут трудности... попросите меня помочь вам... (я немного пытался, но немного сложновато вписать ваш код). Я думаю, вы сможете сделать это очень легко (вы уже знаете, как работает ваш код)