Fehlende Rahmenlinien in der Latex-Tabelle

Fehlende Rahmenlinien in der Latex-Tabelle

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}

Bildbeschreibung hier eingeben

Antwort1

Bei den Paketen tabularrayund siunitxwerden 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}

Bildbeschreibung hier eingeben

Antwort2

Das Problem besteht darin, dass die Dokumentklasse sn-jnl(2019/11/18 v0.1, Zeile 1333) definiert \let\cline\cmidrule. Zu diesem Zeitpunkt \cmidruleist jedoch noch undefiniert, da das Paket booktabszu diesem Zeitpunkt noch nicht geladen wurde. Dies führt zu einem Fehler, da \clinenicht definiert ist. Dies sollte eigentlich als Fehler im Code der Dokumentklasse betrachtet werden. Sie können diesen Fehler umgehen, indem Sie das booktabsPaket mit laden \RequirePackage{booktabs}, bevor Sie verwenden \documentclass( \usepackagefunktioniert 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-jnlKlasse setzt jetzt \clineals 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 booktabsPaket 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}

Bildbeschreibung hier eingeben


Eine andere, etwas umständlichere Methode wäre, das ursprüngliche \clineMakro 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}

Bildbeschreibung hier eingeben

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 \multicolumnMakros 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 nicematrixmit \usepackage{nicematrix}aber nicematrixverwendet pgfund in der Klasse geladen sn-jnl,pgf muss in der Klasse geladen werdenVordas \documentclass(mit \RequirePackage).

  • Ich habe \begin{tabular}und end{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}

Ausgabe des obigen Codes

Die Regeln werden nicht verletzt, da in den Umgebungen von nicematrixneu clinedefiniert wird (und diese Definition lokal die von \nclinedurchgeführte Neudefinition von überschreibt sn-jnl).

{NiceTabular}Die Standardmethode zum Erstellen Ihrer Tabelle (mit den Tools von ) ist jedoch nicematrixwie 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}

Ausgabe des zweiten Codes

verwandte Informationen