![Fehlende Rahmenlinien in der Latex-Tabelle](https://rvso.com/image/461891/Fehlende%20Rahmenlinien%20in%20der%20Latex-Tabelle.png)
Wieder einmal fehlen mir beim Portieren des Latex-Tabellencodes von einer Zeitschrift in das Springer-Format die Rahmenlinien (Bild angehängt). Der Latex-Code lautet wie folgt. Bitte schlagen Sie eine Lösung für fehlende Rahmen und automatischen Zeilenumbruch vor, um die Seitenbreite anzupassen, anstatt die manuelle Vorgehensweise, die ich verwendet habe.\\
\usepackage{adjustbox}
%\usepackage{tabularx}
\usepackage{tabularx,ragged2e}
\documentclass{sn-jnl}
\begin{document}
\begin{table*}[!h]
%\tiny
\centering
\small
\caption{Result}
\begin{tabular}{|c|c|c|c|}
\hline
\multicolumn{1}{|l|}{\begin{tabular}[c]{@{}l@{}}Users Set\\Size (USS)\end{tabular}} & \multicolumn{1}{l|}{\begin{tabular}[c]{@{}l@{}} Range of Users \\ Individual \end{tabular}} & \multicolumn{1}{l|}{\begin{tabular}[c]{@{}l@{}}Index of scalar array \\ for mapping\end{tabular}} & \multicolumn{1}{l|}{\begin{tabular}[c]{@{}l@{}}Transfer \\ Failure\end{tabular}} \\ \hline
\multirow{6}{*}{6} & \multirow{2}{*}{6} & 10 & 23 \\ \cline{3-4}
& & 4 & \textbf{18.3} \\ \cline{2-4}
& \multirow{2}{*}{7} & 0 & 13.3 \\ \cline{3-4}
& & 4 & \textbf{33.3} \\ \cline{2-4}
& \multirow{2}{*}{7} & 1 & 17 \\ \cline{3-4}
& & 2 & \textbf{66.6} \\ \hline
\end{tabular}
\end{table}
\end{document}
Antwort1
Bei den Paketen tabularray
und siunitx
werden Probleme mit vertikalen Linien eliminiert und die Zahlen in der letzten Spalte werden an den Dezimalstellen ausgerichtet:
\documentclass{sn-jnl}
\usepackage{xcolor}
\usepackage{tabularray}
\UseTblrLibrary{siunitx}
\begin{document}
\begin{table*}[ht]
\caption{Result}
\sisetup{table-format=2.1,
detect-weight, % <--
}
\begin{tblr}{hlines, vlines,
colspec = {X[c] X[1.2,c] X[1.8,c] X[c, si]},
cell{even}{2} = {r=2}{},
cell{odd[3]}{Z} = {font=\bfseries},
row{1} = {guard}
}
Users Set Size (USS)
& Range of Users Individual
& Index of scalar array for mapping
& Transfer Failure \\
\SetCell[r=6]{c} 6
& 6 & 10& 23 \\
& & 4 & 18.3 \\
& 7 & 0 & 13.3 \\
& & 4 & 33.3 \\
& 7 & 1 & 17 \\
& & 2 & 66.6 \\
\end{tblr}
\end{table*}
\end{document}
Antwort2
Das Problem besteht darin, dass die Dokumentklasse sn-jnl
(2019/11/18 v0.1, Zeile 1333) definiert \let\cline\cmidrule
. Zu diesem Zeitpunkt \cmidrule
ist jedoch noch undefiniert, da das Paket booktabs
zu diesem Zeitpunkt noch nicht geladen wurde. Dies führt zu einem Fehler, da \cline
nicht definiert ist. Dies sollte eigentlich als Fehler im Code der Dokumentklasse betrachtet werden. Sie können diesen Fehler umgehen, indem Sie das booktabs
Paket mit laden \RequirePackage{booktabs}
, bevor Sie verwenden \documentclass
( \usepackage
funktioniert nicht vor \documentclass
).
Wenn man diesen eingebauten Fehler jedoch beiseite lässt, möchten die Autoren der Dokumentklasse offensichtlich, dass Sie diebooktabs
Paket verwenden, dasunterstützt keine vertikalen Linien. Die Verwendung der von diesem Paket bereitgestellten Makros, darunter auch \cmidrule
, fügt einen vertikalen Abstand ein, der vertikale Regeln verletzt. Die sn-jnl
Klasse setzt jetzt \cline
als Alias auf \cmidrule
, weshalb Sie diese unterbrochenen Ränder erhalten.
Es gibt zwei Möglichkeiten, dies zu umgehen. Die erste Möglichkeit besteht darin, sich mit dem zu arrangieren, was die Autoren dieses Pakets wahrscheinlich beabsichtigt haben, und die vom booktabs
Paket bereitgestellten Funktionen zu übernehmen, d. h. die Verwendung vertikaler Linien zu vermeiden und möglicherweise sogar auf s zu verzichten \multirow
:
\documentclass{sn-jnl}
\begin{document}
\begin{table*}[!h]
\centering
\small
\caption{Result}
\begin{tabular}{ c c c c }
\toprule
\begin{tabular}{@{}l@{}} Users Set \\ Size (USS) \end{tabular} &
\begin{tabular}{@{}l@{}} Range of Users \\ Individual \end{tabular} &
\begin{tabular}{@{}l@{}} Index of scalar array \\ for mapping \end{tabular} &
\begin{tabular}{@{}l@{}} Transfer \\ Failure \end{tabular} \\
\midrule
6 & 6 & 10 & 23 \\ \cline{3-4}
& & 4 & \textbf{18.3} \\ \cline{2-4}
& 7 & 0 & 13.3 \\ \cline{3-4}
& & 4 & \textbf{33.3} \\ \cline{2-4}
& 7 & 1 & 17 \\ \cline{3-4}
& & 2 & \textbf{66.6} \\
\bottomrule
\end{tabular}
\end{table*}
\end{document}
Eine andere, etwas umständlichere Methode wäre, das ursprüngliche \cline
Makro vor dem Laden der Dokumentklasse zu speichern und später die Definition von \cline
: wiederherzustellen:
\let\clineorig\cline
\documentclass{sn-jnl}
\usepackage{multirow}
\begin{document}
\begin{table*}[!h]
\centering
\small
\caption{Result}
\let\cline\clineorig
\begin{tabular}{|c|c|c|c|}
\hline
\begin{tabular}{@{}l@{}} Users Set \\ Size (USS) \end{tabular} &
\begin{tabular}{@{}l@{}} Range of Users \\ Individual \end{tabular} &
\begin{tabular}{@{}l@{}} Index of scalar array \\ for mapping \end{tabular} &
\begin{tabular}{@{}l@{}} Transfer \\ Failure \end{tabular} \\
\hline
\multirow{6}{*}{6} & \multirow{2}{*}{6} & 10 & 23 \\ \cline{3-4}
& & 4 & \textbf{18.3} \\ \cline{2-4}
& \multirow{2}{*}{7} & 0 & 13.3 \\ \cline{3-4}
& & 4 & \textbf{33.3} \\ \cline{2-4}
& \multirow{2}{*}{7} & 1 & 17 \\ \cline{3-4}
& & 2 & \textbf{66.6} \\
\hline
\end{tabular}
\end{table*}
\end{document}
Ich persönlich würde die erste Lösung empfehlen.
Was den Zeilenumbruch betrifft: Es ist völlig in Ordnung, Zeilenumbrüche zu verschachteln tabulars
, aber Sie müssen sie nicht in \multicolumn
Makros platzieren. Ich habe den Code in dieser Hinsicht vereinfacht. Eine andere Möglichkeit wäre, den p{}
Spaltentyp anzuwenden, der Zeilenumbrüche zulässt, aber Sie müssten LaTeX die Breite der Spalte mitteilen (zum Beispiel p{1cm}
für eine Spaltenbreite von 1 cm).
Antwort3
Zur Information: Hier erfahren Sie, was Sie erhalten, wenn Sie {NiceTabular}
anstelle von verwenden {tabular}
.
Ich habe
nicematrix
mit\usepackage{nicematrix}
abernicematrix
verwendetpgf
und in der Klasse geladensn-jnl
,pgf
muss in der Klasse geladen werdenVordas\documentclass
(mit\RequirePackage
).Ich habe
\begin{tabular}
undend{tabular}
durch\begin{NiceTabular}
und ersetzt\end{NiceTabular}
.
\RequirePackage{pgf}
\documentclass{sn-jnl}
\usepackage{nicematrix}
\begin{document}
\begin{NiceTabular}{|c|c|c|c|}
\hline
\multicolumn{1}{|l|}{\begin{tabular}[c]{@{}l@{}}Users Set\\Size (USS)\end{tabular}} & \multicolumn{1}{l|}{\begin{tabular}[c]{@{}l@{}} Range of Users \\ Individual \end{tabular}} & \multicolumn{1}{l|}{\begin{tabular}[c]{@{}l@{}}Index of scalar array \\ for mapping\end{tabular}} & \multicolumn{1}{l|}{\begin{tabular}[c]{@{}l@{}}Transfer \\ Failure\end{tabular}} \\ \hline
\multirow{6}{*}{6} & \multirow{2}{*}{6} & 10 & 23 \\ \cline{3-4}
& & 4 & \textbf{18.3} \\ \cline{2-4}
& \multirow{2}{*}{7} & 0 & 13.3 \\ \cline{3-4}
& & 4 & \textbf{33.3} \\ \cline{2-4}
& \multirow{2}{*}{7} & 1 & 17 \\ \cline{3-4}
& & 2 & \textbf{66.6} \\ \hline
\end{NiceTabular}
\end{document}
Die Regeln werden nicht verletzt, da in den Umgebungen von nicematrix
neu cline
definiert wird (und diese Definition lokal die von \ncline
durchgeführte Neudefinition von überschreibt sn-jnl
).
{NiceTabular}
Die Standardmethode zum Erstellen Ihrer Tabelle (mit den Tools von ) ist jedoch nicematrix
wie folgt.
\RequirePackage{pgf}
\documentclass{sn-jnl}
\usepackage{nicematrix}
\usepackage{siunitx}
\begin{document}
\sisetup{table-format = 2.1,detect-weight}
\begin{NiceTabular}{cccS}[hvlines]
\Block[l]{}{Users Set\\ Size (USS)}
& \Block[l]{}{Range of Users\\ Individual}
& \Block[l]{}{Index of scalar array\\ for mapping}
& \Block[l]{}{Transfer\\ Failure} \\
\Block{6-1}{6} & \Block{2-1}{6} & 10 & 23 \\
& & 4 & \bfseries 18.3 \\
& \Block{2-1}{7} & 0 & 13.3 \\
& & 4 & \bfseries 33.3 \\
& \Block{2-1}{7} & 1 & 17 \\
& & 2 & \bfseries 66.6 \\
\end{NiceTabular}
\end{document}