我想要居中单元格和tabularx 中有手动换行符。我在 stackexchange 和其他 latex 相关页面中搜索了很多,但找不到解决方案
\documentclass{article}
\usepackage[utf8]{inputenc}
\usepackage{tabularx}
\usepackage[]{multirow}
\usepackage[]{MnSymbol}
\usepackage[]{array}
\usepackage{multicol}
\begin{document}
\maketitle
\section{Introduction}
\newcolumntype{P}[1]{>{\centering\arraybackslash}p{#1}}
\begin{table}
\centering
\begin{tabularx}{1\linewidth}{lX|P{0.2\linewidth}|P{0.2\linewidth}|P{0.2\linewidth}}
& & \textbf{firmware} & \textbf{bootloader} & \textbf{os} \\
\multicolumn{2}{l}{\textbf{Target1}} & & & \\
& {\footnotesize rot\par} & test123 \newline hallo & {\footnotesize $(\uparrow)$ \newline testtext\par} & {\footnotesize $(\nearrow)$ \newline hardware\par} \\
\hline
\hline
\end{tabularx}
\end{table}
\end{document}
为什么每个单元格的第一行没有居中对齐?如果单元格内没有换行符,则第一行正确对齐。如何解决这个问题?提前致谢
答案1
之所以不能按预期工作,是因为\centering
只有正确工作如果相关文本以\par
。
\documentclass[border=10pt]{standalone}
\begin{document}
\parbox{5cm}{%
\centering This is a line \newline
And this is another line %
}
\parbox{5cm}{%
\centering This is a line \par
And this is another line % (implicit \par at the end of the \parbox)
}
\end{document}
\centering
如果您在列内使用,情况也是如此p
,因为这实际上会将 放置\parbox
在表格单元格内。因此,\newline
您不应在这些单元格内使用,而应使用\par
(或输入一个空白行):
\documentclass{article}
\usepackage{tabularx}
\newcolumntype{P}[1]{>{\centering\arraybackslash}p{#1}}
\begin{document}
\begin{table}
\centering
\begin{tabularx}{1\linewidth}{lX|P{0.2\linewidth}|P{0.2\linewidth}|P{0.2\linewidth}}
& & \textbf{firmware} & \textbf{bootloader} & \textbf{os} \\
\multicolumn{2}{l}{\textbf{Target1}} & & & \\
& \footnotesize rot & test123 \par hallo & \footnotesize $(\uparrow)$ \par testtext & \footnotesize $(\nearrow)$ \par hardware \\
\hline
\hline
\end{tabularx}
\end{table}
\end{document}
我从代码中删除了本示例不需要的所有包,并稍微简化了代码。
答案2
你问,
为什么每个单元格的第一行没有居中对齐?...如何解决这个问题?
恐怕我不能告诉你为什么出现了你遇到的问题,但我可以提出一个解决方案:加载包ragged2e
,它提供了一个名为的宏\Centering
,并替换
>{\centering\arraybackslash}p{#1}
和
>{\Centering}p{#1}
\documentclass{article}
\usepackage{tabularx,ragged2e}
%% 2 ways to create a centered "p"-type column:
\newcolumntype{P}[1]{>{\centering\arraybackslash}p{#1}}
\newcolumntype{Q}[1]{>{\Centering}p{#1}}
\usepackage[skip=0.333\baselineskip]{caption} % optional
\begin{document}
\begin{table}[ht]
\caption*{with \ttfamily >\{\string\centering\string\arraybackslash\}}
\begin{tabularx}{\linewidth}{ X *{3}{| P{0.2\linewidth}} }
& \textbf{firmware} & \textbf{bootloader} & \textbf{os} \\
\hline
Target1
& test123 \newline hallo
& \footnotesize $(\uparrow)$ \newline testtext
& \footnotesize $(\nearrow)$ \newline hardware \\
\hline
\end{tabularx}
\end{table}
\begin{table}[h]
\caption*{with \ttfamily >\{\string\Centering\}}
\begin{tabularx}{\linewidth}{ X *{3}{| Q{0.2\linewidth}} }
& \textbf{firmware} & \textbf{bootloader} & \textbf{os} \\
\hline
Target1
& test123 \newline hallo
& \footnotesize $(\uparrow)$ \newline testtext
& \footnotesize $(\nearrow)$ \newline hardware \\
\hline
\end{tabularx}
\end{table}
\end{document}
答案3
我没有遇到您的代码居中问题,但如果您有最新版本的array
,我建议您简化代码,该版本定义了wc{some length}
列类型。现在也不需要加载\usepackage[utf8]{inputenc}
,因为这是 latex 现在默认需要的编码。
\documentclass{article}
\usepackage{tabularx}
\usepackage[]{multirow}
\usepackage[]{MnSymbol}
\usepackage[]{array}
\usepackage{multicol}
\begin{document}
%\maketitle
\section{Introduction}
\begin{table}
\centering
\begin{tabularx}{1\linewidth}{l>{\centering\arraybackslash}X|wc{0.2\linewidth}|wc{0.2\linewidth}|wc{0.2\linewidth}|}
& & \textbf{firmware} & \textbf{bootloader} & \textbf{os} \\
\multicolumn{2}{l|}{\textbf{Target1}} & & & \\
& {\footnotesize rot\par} & test123 \newline hallo & {\footnotesize $(\uparrow)$ \newline testtext\par} & {\footnotesize $(\nearrow)$ \newline hardware\par} \\
\hline
\hline
\end{tabularx}
\end{table}
\end{document}