如何将我的 longtable 的长度设置为文本宽度?

如何将我的 longtable 的长度设置为文本宽度?

我尝试过用几种方法来设置我的长表的宽度,但似乎都不起作用。它仍然超出了我的页面...有人能帮我吗?

\documentclass{article}
\usepackage[T1]{fontenc}
\usepackage{textcomp}
\DeclareUnicodeCharacter{20AC}{\texteuro}

\def\setcitestyle{}
\def\citep{\cite}
\usepackage{longtable}

\begin{document}

\setlength\LTleft{0pt} % see p. 7 of longtable package user guide
\setlength\LTright{0pt}
\begin{longtable}{@{} l @{\extracolsep{\fill}} ccc @{}}

\hline
\multicolumn{1}{|c|}{\textbf{Maatregel}} & \multicolumn{1}{c|}{\textbf{Onderhoudswerkzaamheden}} & \multicolumn{1}{c|}{\textbf{Jaarlijkse kosten}} \\ \hline
\textbf{Bovengronds} &  &  \\ \hline
\multicolumn{1}{|l|}{Vergoenen tuinen (particulier)} & \multicolumn{1}{l|}{x} & nvt \\ \hline
\multicolumn{1}{|l|}{\begin{tabular}[c]{@{}l@{}}Openbaar groen aanleggen of groen verlagen \\ (infiltratieveld)\end{tabular}} & \multicolumn{1}{l|}{\begin{tabular}[c]{@{}l@{}}- Grasmaaien (1x per 2 weken)\\ - Beluchten en verticuteren \\ (1x per jaar)\end{tabular}} & €2,15 per m2 \\ \hline
\multicolumn{1}{|l|}{WADI's} & \multicolumn{1}{l|}{\begin{tabular}[c]{@{}l@{}}Groendonderhoud:\\ - Grasmaaien, zwerfvuil verwijderen \\ (1x per 2 weken)\\ - Bladeren verwijderen en verticuteren \\ (1x per jaar)\\ \\ Correctief onderhoud:\\ - Opnieuw inzaaien (1x per jaar)\\ - Bodemverbetering (1x per 2 jaar)\\ - Toplaag vervangen (1x per 10 jaar)\end{tabular}} & €7,40 per m2 \\ \hline
\multicolumn{1}{|l|}{Oppervlakte water aanleggen} & \multicolumn{1}{l|}{\begin{tabular}[c]{@{}l@{}}Klein onderhoud:\\ - Maaien natte profiel incl. verwijderen \\ drijfvuil (1x per halfjaar)\\ \\ \\ Groot onderhoud:\\ - Baggeren profiel (1x per 5 jaar)\\ - Verwijderen gezonken voorwerpen \\ (1x per jaar)\\ - Oeveronderhoud (1x per jaar)\\\setcitestyle{authoryear,square,aysep={},yysep={;}}\citep{bodemrichtlijn, regelgeving}\end{tabular}} & €2,75 per m2 \\ \hline
\multicolumn{1}{|l|}{\begin{tabular}[c]{@{}l@{}}Herinrichting straat \\ (waterinfiltrerende verharding)\end{tabular}} & \multicolumn{1}{l|}{\begin{tabular}[c]{@{}l@{}}Onderzoek:\\ - Visueel inspecteren (1x per jaar)\\ - Doorlatendheid meten (1x per 3 jaar)\\ \\ Onderhoud:\\ - Vegen (1-6x per jaar)\\ - Diepreiniging (1x per 1-7 jaar)\\ - Aanvullen voegspit na reiniging \\ (1x per 1-7 jaar)\\ - Onkruidbestrijding (4-8x per jaar)\end{tabular}} & €3,55 per m2 \\ \hline
\textbf{Benedengronds} &  &  \\ \hline
\multicolumn{1}{|l|}{Riolering vergroten} & \multicolumn{1}{l|}{x} & nvt \\ \hline
\multicolumn{1}{|l|}{Infiltratiebuizen} & \multicolumn{1}{l|}{Doorspuiten (1x per 3-5 jaar)} & €0,05 per m \\ \hline
\multicolumn{1}{|l|}{Infiltratiekelders} & \multicolumn{1}{l|}{Reiniging (1x per 5 jaar)} & €400,- per 100 m3 \\ \hline
\multicolumn{1}{|l|}{Infiltratiekratten} & \multicolumn{1}{l|}{\begin{tabular}[c]{@{}l@{}}- Inspectie (1x per jaar)\\ - Leegzuigen en onderhouden \\ (1x per 2 jaar)\end{tabular}} & €4,40 per m2 \\ \hline
\multicolumn{1}{|l|}{Bergbezinkbassin} & \multicolumn{1}{l|}{\begin{tabular}[c]{@{}l@{}}Spoelpompen reinigen bergings-\\ kelder automatisch (getal ontbreekt)\end{tabular}} & nvt \\ \hline
\end{longtable}
\end{document}

答案1

借助booktabs水平线,xltabular为了使表格适合文本宽度,makecell借助列标题和enumitem逐项列表,您可以实现以下结果。我专注于表格的前半部分,其余部分可以使用相同的技术进行调整:

在此处输入图片描述

\documentclass{article}
\usepackage{xltabular}
\usepackage[T1]{fontenc}
\usepackage{textcomp}
\DeclareUnicodeCharacter{20AC}{\texteuro}


\usepackage{enumitem}
\newlist{tabitem}{itemize}{1}
\setlist[tabitem]{wide=0pt, nosep, leftmargin= * ,label=\textendash,}
\usepackage{makecell}
\renewcommand{\theadfont}{\normalsize\bfseries}

\usepackage{booktabs}

\usepackage{makecell}
\begin{document}

\begin{xltabular}{\linewidth}{>{\raggedright\arraybackslash}p{2.75cm}Xl}
\toprule
\thead{Maatregel} & \thead{Onderhoudswerkzaamheden} & \thead{Jaarlijkse\\ kosten} \\ \hline
\textbf{Bovengronds} &  &  \\ 
\midrule
Vergoenen tuinen (particulier) & x & nvt \\ \addlinespace
Openbaar groen aanleggen of groen verlagen \newline (infiltratieveld) 
    & \begin{tabitem}[before=\vspace{-\baselineskip}, after=\vspace{-\baselineskip}]
        \item Grasmaaien (1x per 2 weken)
        \item Beluchten en verticuteren (1x per jaar) 
       \end{tabitem}
        & €2,15 per m2 \\ \addlinespace
WADI's 
    & Groendonderhoud: \begin{tabitem}
                        \item Grasmaaien, zwerfvuil verwijderen (1x per 2 weken)
                        \item Bladeren verwijderen en verticuteren (1x per jaar)
                        \end{tabitem}
       Correctief onderhoud:\begin{tabitem}[after=\vspace{-\baselineskip}]
                              \item Opnieuw inzaaien (1x per jaar)
                              \item Bodemverbetering (1x per 2 jaar)
                              \item Toplaag vervangen (1x per 10 jaar) 
                            \end{tabitem}
        & €7,40 per m2 \\  \addlinespace
%\multicolumn{1}{|l|}{Oppervlakte water aanleggen} & \multicolumn{1}{l|}{\begin{tabular}[c]{@{}l@{}}Klein onderhoud:\\ - Maaien natte profiel incl. verwijderen \\ drijfvuil (1x per halfjaar)\\ \\ \\ Groot onderhoud:\\ - Baggeren profiel (1x per 5 jaar)\\ - Verwijderen gezonken voorwerpen \\ (1x per jaar)\\ - Oeveronderhoud (1x per jaar)\\\setcitestyle{authoryear,square,aysep={},yysep={;}}\citep{bodemrichtlijn, regelgeving}\end{tabular}} & €2,75 per m2 \\ \hline
%\multicolumn{1}{|l|}{\begin{tabular}[c]{@{}l@{}}Herinrichting straat \\ (waterinfiltrerende verharding)\end{tabular}} & \multicolumn{1}{l|}{\begin{tabular}[c]{@{}l@{}}Onderzoek:\\ - Visueel inspecteren (1x per jaar)\\ - Doorlatendheid meten (1x per 3 jaar)\\ \\ Onderhoud:\\ - Vegen (1-6x per jaar)\\ - Diepreiniging (1x per 1-7 jaar)\\ - Aanvullen voegspit na reiniging \\ (1x per 1-7 jaar)\\ - Onkruidbestrijding (4-8x per jaar)\end{tabular}} & €3,55 per m2 \\ \hline
%\textbf{Benedengronds} &  &  \\ \hline
%\multicolumn{1}{|l|}{Riolering vergroten} & \multicolumn{1}{l|}{x} & nvt \\ \hline
%\multicolumn{1}{|l|}{Infiltratiebuizen} & \multicolumn{1}{l|}{Doorspuiten (1x per 3-5 jaar)} & €0,05 per m \\ \hline
%\multicolumn{1}{|l|}{Infiltratiekelders} & \multicolumn{1}{l|}{Reiniging (1x per 5 jaar)} & €400,- per 100 m3 \\ \hline
%\multicolumn{1}{|l|}{Infiltratiekratten} & \multicolumn{1}{l|}{\begin{tabular}[c]{@{}l@{}}- Inspectie (1x per jaar)\\ - Leegzuigen en onderhouden \\ (1x per 2 jaar)\end{tabular}} & €4,40 per m2 \\ \hline
%\multicolumn{1}{|l|}{Bergbezinkbassin} & \multicolumn{1}{l|}{\begin{tabular}[c]{@{}l@{}}Spoelpompen reinigen bergings-\\ kelder automatisch (getal ontbreekt)\end{tabular}} & nvt \\ 
\bottomrule
\end{xltabular}

\end{document}

答案2

这是使用 longtable 的 MWE,其中有所有难看的垂直线和水平线。我重新定义\arraystretch并增加了\extrarowheight表格中的空白。

正如您将看到的,我在三列的定义中计算了相对于边距和相对于另一列的列宽:

    \newcolumntype{F}{>{\RaggedRight\arraybackslash}
     p{\dimexpr(((\linewidth/18)*6)-(2\tabcolsep+2\arrayrulewidth))\relax}}

如果您喜欢不同的分布,只需将数字更改6为其他数字,但要确保三个定义累积到 18。如果您更改边距,则 longtable 将会适应。

在单元格内,我更喜欢用 itemize-lists\minipage来取消上下空间。这样\hsize可以增加列宽(感谢 David Carlisle)。

在此处输入图片描述

\documentclass[dutch]{article}
\usepackage{babel}
\usepackage[T1]{fontenc}
\usepackage{textcomp, array, ragged2e, enumitem}
\DeclareUnicodeCharacter{20AC}{\texteuro}

\def\setcitestyle{}
\def\citep{\cite}
\usepackage{longtable}
\def\arraystretch{1.1}
\setlength{\extrarowheight}{1pt}

\newcolumntype{F}{>{\RaggedRight\arraybackslash}p{\dimexpr(((\linewidth/18)*6)-(2\tabcolsep+2\arrayrulewidth))\relax}}
\newcolumntype{M}{>{\RaggedRight\arraybackslash}p{\dimexpr(((\linewidth/18)*8)-(2\tabcolsep+\arrayrulewidth))\relax}}
\newcolumntype{L}{>{\Centering\arraybackslash}p{\dimexpr(((\linewidth/18)*4)-(2\tabcolsep+\arrayrulewidth))\relax}}


\begin{document}

\setlist[itemize]{wide=0pt, nosep, leftmargin= * ,label=\textendash}

\setlength\LTleft{0pt} % see p. 7 of longtable package user guide
\setlength\LTright{0pt}
\begin{longtable}{|F|M|L|}

\hline
\endfirsthead

\hline
\endhead

\multicolumn{1}{|F|}{\bfseries Maatregel} & \multicolumn{1}{M|}{\bfseries Onderhoudswerkzaamheden} & \multicolumn{1}{L|}{\bfseries Jaarlijkse kosten} \\ \hline
\multicolumn{3}{|l|}{\bfseries Bovengronds}  \\ \hline
Vergoenen tuinen (particulier) & x & nvt \\ \hline
Openbaar groen aanleggen of groen verlagen (infiltratieveld) &
\begin{minipage}[t]{\hsize}
\begin{itemize}
\item Grasmaaien (1x per 2 weken)
\item Beluchten en verticuteren  (1x per jaar)
\end{itemize}
\end{minipage}
 & €2,15 per m2 \\ \hline
WADI's &
\begin{minipage}[t]{\hsize}
Groendonderhoud: 
\begin{itemize}
\item Grasmaaien, zwerfvuil verwijderen  (1x per 2 weken)
\item Bladeren verwijderen en verticuteren  (1x per jaar)
\end{itemize}
\smallskip
Correctief onderhoud:
\begin{itemize}
\item Opnieuw inzaaien (1x per jaar)
\item Bodemverbetering (1x per 2 jaar)
\item Toplaag vervangen (1x per 10 jaar)
\end{itemize}
\end{minipage} & 
€7,40 per m2 \\ \hline
Oppervlakte water aanleggen &
\begin{minipage}[t]{\hsize}
Klein onderhoud: 
    \begin{itemize}
    \item Maaien natte profiel incl. verwijderen  drijfvuil (1x per halfjaar) 
    \end{itemize}
\smallskip
Groot onderhoud: 
    \begin{itemize}
    \item Baggeren profiel (1x per 5 jaar)
    \item Verwijderen gezonken voorwerpen  (1x per jaar)
    \item Oeveronderhoud (1x per jaar)
    \end{itemize}
\end{minipage}
%\setcitestyle{authoryear,square,aysep={},yysep={;}}\citep{bodemrichtlijn, regelgeving} 
& €2,75 per m2 \\ \hline
Herinrichting straat  (waterinfiltrerende verharding) & 
\begin{minipage}[t]{\hsize}
Onderzoek:
    \begin{itemize}
    \item Visueel inspecteren (1x per jaar)
    \item Doorlatendheid meten (1x per 3 jaar)
    \end{itemize}
\smallskip
Onderhoud:
    \begin{itemize}
    \item Vegen (1-6x per jaar)
    \item Diepreiniging (1x per 1-7 jaar)
    \item Aanvullen voegspit na reiniging  (1x per 1-7 jaar)
    \item Onkruidbestrijding (4-8x per jaar)
    \end{itemize} 
\end{minipage} & 
€3,55 per m2 \\ \hline\pagebreak[3]
\multicolumn{3}{|l|}{\bfseries Benedengronds}   \\ \nopagebreak\hline
Riolering vergroten & x & nvt \\ \hline
Infiltratiebuizen & Doorspuiten (1x per 3-5 jaar) & €0,05 per m \\ \hline
Infiltratiekelders & Reiniging (1x per 5 jaar) & €400,- per 100 m3 \\ \hline
Infiltratiekratten &
\begin{minipage}[t]{\hsize}
\begin{itemize}
\item Inspectie (1x per jaar)
\item Leegzuigen en onderhouden  (1x per 2 jaar)
\end{itemize}
\end{minipage} & 
€4,40 per m2 \\ \hline
Bergbezinkbassin & Spoelpompen reinigen bergingskelder automatisch (getal ontbreekt) & nvt \\ \hline
\end{longtable}
\end{document}

答案3

再举一个例子:使用xltabular并定义第二列\minipage

\newcolumntype{R}{>{\minipage[t]{\hsize}\raggedright\arraybackslash}X<{\endminipage}}  

完成 MWE:

\documentclass{article}
\usepackage[T1]{fontenc}
\usepackage{textcomp}
\DeclareUnicodeCharacter{20AC}{\texteuro}
\usepackage{booktabs, makecell, xltabular}
\renewcommand{\theadfont}{\normalsize\bfseries}
\renewcommand\theadgape{}
\newcolumntype{R}[1]{>{\minipage[t]{\hsize}\raggedright\arraybackslash}p{#1}<{\endminipage}}  
\usepackage{enumitem}
\newlist{tabitem}{itemize}{1}
\setlist[tabitem]{nosep, leftmargin=*, label=\textendash,}

%---------------- show page layout. don't use in a real document!
\usepackage{showframe}
\renewcommand\ShowFrameLinethickness{0.15pt}
\renewcommand*\ShowFrameColor{\color{red}}

\begin{document}

\begin{xltabular}{\linewidth}{@{}>{\raggedleft\arraybackslash}p{30mm} R l @{}}
     \toprule
\thead{Maatregel} 
    &   \thead{Onderhoudswerkzaamheden} 
        &   \thead{Jaarlijkse\\ kosten}     \\ 
    \midrule
\endhead
%
\textbf{Bovengronds} &  &  \\
    \midrule
Vergoenen tuinen (particulier) & x & nvt \\ 
    \addlinespace[9pt]
Openbaar groen aanleggen of groen verlagen (infiltratieveld)
    & \begin{tabitem}
        \item Grasmaaien (1x per 2 weken)
        \item Beluchten en verticuteren (1x per jaar)
       \end{tabitem}            & €2,15 per m2  \\ 
    \addlinespace[9pt]
WADI's
    &   Groendonderhoud:      
            \begin{tabitem}
        \item Grasmaaien, zwerfvuil verwijderen (1x per 2 weken)
        \item Bladeren verwijderen en verticuteren (1x per jaar)
            \end{tabitem}
       Correctief onderhoud:
            \begin{tabitem}
        \item Opnieuw inzaaien (1x per jaar)
        \item Bodemverbetering (1x per 2 jaar)
        \item Toplaag vervangen (1x per 10 jaar)
            \end{tabitem}       &   €7,40 per m2        \\
    \addlinespace[9pt]
Oppervlakte water aanleggen
    &   Klein onderhoud:
        \begin{tabitem}
    \item   Maaien natte profiel incl. verwijderen drijfvuil (1x per halfjaar)
        \end{tabitem}
        Groot onderhoud:
            \begin{tabitem}
    \item   Baggeren profiel (1x per 5 jaar)
    \item   Verwijderen gezonken voorwerpen (1x per jaar) 
    \item   Oeveronderhoud (1x per jaar) \cite{bodemrichtlijn, regelgeving}
            \end{tabitem}       & €2,75 per m2      \\ 
    \addlinespace[9pt]
Herinrichting straat (waterinfiltrerende verharding)
    &   Onderzoek:
        \begin{tabitem}
    \item   Visueel inspecteren (1x per jaar)
    \item   Doorlatendheid meten (1x per 3 jaar)
        \end{tabitem}
        Onderhoud:
        \begin{tabitem}
    \item   Vegen (1-6x per jaar)
    \item   Diepreiniging (1x per 1-7 jaar) 
    \item   Aanvullen voegspit na reiniging (1x per 1-7 jaar)
    \item   Onkruidbestrijding (4-8x per jaar)
        \end{tabitem}           & €3,55 per m2      \\ 
    \midrule
\textbf{Benedengronds}
    &                           &                   \\  
    \midrule
Riolering vergroten
    &   x                       & nvt               \\
    \addlinespace[9pt]
Infiltratiebuizen
    &   Doorspuiten (1x per 3-5 jaar)   
                                & €0,05 per m       \\ 
    \addlinespace[9pt]
Infiltratiekelders  
    &   Reiniging (1x per 5 jaar)
                                & €400,00 per 100 m3    \\ 
    \addlinespace[9pt]
Infiltratiekratten
    &   \begin{tabitem}
    \item   Inspectie (1x per jaar)
    \item   Leegzuigen en onderhouden (1x per 2 jaar)
        \end{tabitem}           &   €4,40 per m2    \\ 
    \addlinespace[9pt]
Bergbezinkbassin
    &   Spoelpompen reinigen bergings
        \begin{tabitem}
    \item   kelder automatisch (getal ontbreekt)
        \end{tabitem}           &   nvt             \\
    \bottomrule
\end{xltabular}

\end{document}

经过两次编译后,上述MWE的结果是:

在此处输入图片描述

(红线表示页面布局)

相关内容