![Латексный стол с отсутствующими линиями границ](https://rvso.com/image/461891/%D0%9B%D0%B0%D1%82%D0%B5%D0%BA%D1%81%D0%BD%D1%8B%D0%B9%20%D1%81%D1%82%D0%BE%D0%BB%20%D1%81%20%D0%BE%D1%82%D1%81%D1%83%D1%82%D1%81%D1%82%D0%B2%D1%83%D1%8E%D1%89%D0%B8%D0%BC%D0%B8%20%D0%BB%D0%B8%D0%BD%D0%B8%D1%8F%D0%BC%D0%B8%20%D0%B3%D1%80%D0%B0%D0%BD%D0%B8%D1%86.png)
И снова при переносе кода Latex Table из одного журнала в формат Springer я получаю пропущенные линии границ (изображение прикреплено). Код Latex выглядит следующим образом. Пожалуйста, предложите решение для пропущенной границы и автоматического переноса строк для подгонки ширины страницы вместо ручного, как я сделал с помощью\\
\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}
решение1
С пакетами tabularray
и siunitx
проблемы с вертикальными линиями устранены, а числа в последнем столбце выравниваются по десятичным точкам:
\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}
решение2
Проблема в том, что класс документа sn-jnl
(2019/11/18 v0.1, строка 1333) определяет \let\cline\cmidrule
. Однако в этот момент \cmidrule
все еще не определен, поскольку пакет booktabs
не был загружен в этот момент. Это приведет к ошибке, поскольку \cline
не определен. На самом деле это следует считать ошибкой в коде класса документа. Вы можете обойти эту ошибку, загрузив пакет booktabs
с помощью \RequirePackage{booktabs}
перед использованием \documentclass
( \usepackage
не будет работать до \documentclass
).
Однако, оставив в стороне эту встроенную ошибку, авторы класса документа, очевидно, хотят, чтобы вы использовалиbooktabs
которыйне поддерживает вертикальные линии. Использование макросов, предоставляемых этим пакетом, среди которых также \cmidrule
, вставляет некоторый вертикальный интервал, который нарушает вертикальные правила. Класс sn-jnl
теперь задается \cline
как псевдоним для \cmidrule
, поэтому вы получаете эти сломанные границы.
Есть два способа обойти это. Первый способ — согласиться с тем, что, вероятно, имели в виду авторы этого пакета, и принять возможности, предоставляемые пакетом booktabs
, то есть избегать использования вертикальных линий и, возможно, даже обойтись без \multirow
s:
\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}
Другой, более хакерский способ — сохранить исходный \cline
макрос перед загрузкой класса документа и позже восстановить определение \cline
:
\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}
Лично я бы рекомендовал первое решение.
Что касается разрыва строк: вкладывать их совершенно нормально tabulars
, но вам не нужно помещать их внутрь \multicolumn
макросов. Я упростил код в этом отношении. Другим способом может быть применение p{}
типа столбца, который позволяет вам разрывать строки, но вам нужно будет указать LaTeX ширину столбца (например, p{1cm}
для ширины столбца 1 см).
решение3
Для информации, вот что вы получите, используя {NiceTabular}
вместо {tabular}
.
Я загрузил
nicematrix
с помощью\usepackage{nicematrix}
, ноnicematrix
используетpgf
и, в классеsn-jnl
,pgf
должен быть загружендо\documentclass
(с )\RequirePackage
.Я заменил
\begin{tabular}
иend{tabular}
на\begin{NiceTabular}
и\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}
Правила не нарушаются, поскольку в средах nicematrix
переопределяется cline
(и это определение локально перезаписывает переопределение \ncline
done by sn-jnl
).
Однако {NiceTabular}
стандартный способ построения таблицы (с помощью инструментов nicematrix
) выглядит следующим образом.
\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}