![表 p 列中的幻像空间不一致](https://linux22.com/image/362691/%E8%A1%A8%20p%20%E5%88%97%E4%B8%AD%E7%9A%84%E5%B9%BB%E5%83%8F%E7%A9%BA%E9%97%B4%E4%B8%8D%E4%B8%80%E8%87%B4.png)
后续行动此主题。
问题
phantom
p
似乎具有不一致的行为,这取决于在表中的列类型中使用时是否在调用之前打印某些内容。
- 单独使用时,它会产生换行符;
- 当突出显示时,
colorbox
它会自行修复但会生成 2 个额外字符(空格); - 当以否定为前缀时
hspace
,它可以正常工作,但这似乎不正确; colorbox
当与和一起使用时hspace
,会出现另一个额外的空格。
附加问题
在我的newcolumntype
定义中,我使用textwidth
来定义列的宽度,但这没有考虑到tabcolsep
。有没有办法以某种方式将其重新定义为\textwidth-\tabcolsep
?
演示
平均能量损失
\documentclass{article}
\usepackage{mwe}
\usepackage{booktabs}
\usepackage{array}
\usepackage{hyperref}
\usepackage{xcolor}
\newcolumntype{L}[1]{>{\raggedright\arraybackslash}p{#1\textwidth}}
\newcommand{\mail}[1]{
\href{mailto:#1}{#1}
}
\begin{document}
\centering
\noindent
\begin{tabular}{L{.03}|L{.5}}
\toprule
\textbf{\#} & \textbf{w/ phantom} \\
\midrule
1 & {\ttfamily\phantom{xxx}\mail{[email protected]}} \\
2 & {\ttfamily\phantom{xx}\mail{[email protected]}} \\
3 & {\ttfamily\mail{[email protected]}} \\
\bottomrule
\end{tabular}
\noindent
\begin{tabular}{L{.03}|L{.5}}
\toprule
\textbf{\#} & \textbf{w/ colorbox} \\
\midrule
1 & {\ttfamily\colorbox{red}{\phantom{xxx}}\mail{[email protected]}} \\
2 & {\ttfamily\colorbox{red}{\phantom{xx}}\mail{[email protected]}} \\
3 & {\ttfamily\mail{[email protected]}} \\
\bottomrule
\end{tabular}
\noindent
\begin{tabular}{L{.03}|L{.5}}
\toprule
\textbf{\#} & \textbf{w/ hspace} \\
\midrule
1 & {\ttfamily\hspace{-.5em}\phantom{xxx}\mail{[email protected]}} \\
2 & {\ttfamily\hspace{-.5em}\phantom{xx}\mail{[email protected]}} \\
3 & {\ttfamily\hspace{-.5em}\mail{[email protected]}} \\
\bottomrule
\end{tabular}
\noindent
\begin{tabular}{L{.03}|L{.5}}
\toprule
\textbf{\#} & \textbf{w/ hspace \& colorbox} \\
\midrule
1 & {\ttfamily\hspace{-.5em}\colorbox{red}{\phantom{xxx}}\mail{[email protected]}} \\
2 & {\ttfamily\hspace{-.5em}\colorbox{red}{\phantom{xx}}\mail{[email protected]}} \\
3 & {\ttfamily\hspace{-.5em}\mail{[email protected]}} \\
\bottomrule
\end{tabular}
\end{document}
答案1
新答案(编辑为使用hbox
而不是mbox
@David Carlisle建议的)还添加了\arraystretch
修复
这是一种避免所有问题并自动化所有过程的方法。您必须使用我的代码中的列(r@{}>{@}l 或类似代码),并在表格中给出命令:\nameMAIL{nameHere}
和\MAILon{providerHere}
。它已经创建了您想要的内容,而无需计算空格,如果邮件名称中的数字为 1,结果会很糟糕。(x 长于 1 或l
->small L)。因此,为了避免所有这些问题,您已经可以使用这些命令了。但对于您的示例,也需要一个链接。所以我使用了\tikzmark
(来自这里) 并创建命令LinkAllMails
。只是不要忘记在开始新表格之前将其计数器 ( numOfmails
) 设置为零。代码:
\documentclass{article}
\usepackage{booktabs}
\usepackage{array}
\usepackage{hyperref}
\usepackage{tikz}
\usetikzlibrary{calc}
\makeatletter
\xdef\myfsize{\f@size}
\makeatother
\newcounter{numOfmails}
\newcommand{\tikzmark}[1]{\tikz[overlay,remember picture] \node (#1) {};}
\newcommand{\nameMAIL}[1]{\stepcounter{numOfmails}\tikzmark{MAIL\thenumOfmails}\xdef\temp{#1}\global\expandafter\let\csname Mail\thenumOfmails\endcsname\temp\hbox{\phantom{\temp}}}
\newcommand{\MAILon}[1]{\xdef\temp{#1}\global\expandafter\let\csname MAILon\thenumOfmails\endcsname\temp\hbox{\phantom{\temp}}\tikzmark{MAILon\thenumOfmails}}
\newcommand{\LinkAllMails}{\begin{tikzpicture}[overlay,remember picture]\foreach \i in {1,...,\thenumOfmails}{
\path ($(MAIL\i.north west)+(0,{\myfsize/1.5 pt})$) rectangle node[anchor=center] (NODE\i){} ($(MAILon\i.south east)$);
\node at (NODE\i) {\href{mailto:\csname Mail\i\endcsname@\csname MAILon\i\endcsname}{\csname Mail\i\endcsname\phantom{@}\csname MAILon\i\endcsname}};}\end{tikzpicture}}
\newcolumntype{L}[1]{>{\raggedright\arraybackslash}p{#1\textwidth}}
\begin{document}
\centering
\noindent
\renewcommand{\arraystretch}{1.2}
\begin{tabular}{L{.03}|r@{}>{@}L{0.5}}
\toprule
\textbf{\#} &\multicolumn{2}{c}{\textbf{w/ phantom}}\\
\midrule
1 & \nameMAIL{wab}&\MAILon{gmail.com}\\
2 & \nameMAIL{1ab}&\MAILon{gmail.com}\\
3 &\nameMAIL{ab}&\MAILon{gmail.com}\\
4 &\nameMAIL{abdul}&\MAILon{hotmail.com}\\
5 &\nameMAIL{koleygr}&\MAILon{private.com}\\
\bottomrule
\end{tabular}
\LinkAllMails
\setcounter{numOfmails}{0}
\begin{tabular}{L{.03}|r@{}>{@}L{0.5}}
\toprule
\textbf{\#} &\multicolumn{2}{c}{\textbf{w/ phantom}}\\
\midrule
6 & \nameMAIL{wa7b1}&\MAILon{gmail.com}\\
7 & \nameMAIL{1ab}&\MAILon{gmail.com}\\
8 &\nameMAIL{3ab}&\MAILon{gmail.com}\\
9 &\nameMAIL{abdu5l}&\MAILon{hotmail.com}\\
10 &\nameMAIL{koleygr}&\MAILon{nottooprivate.com}\\
\bottomrule
\end{tabular}
\LinkAllMails
\end{document}
结果:
旧答案:
根据 @egreg 的评论,该\mbox
命令已经“给出”了\leavemode
,因此没有必要在命令\leavemode
前面加上\mbox
。(我现在就保持原样)。
检查一下:
\documentclass{article}
\usepackage{mwe}
\usepackage{booktabs}
\usepackage{array}
\usepackage{hyperref}
\usepackage{xcolor}
\newcolumntype{L}[1]{>{\raggedright\arraybackslash}p{#1\textwidth}}
\newcommand{\mail}[1]{%
\href{mailto:#1}{#1}%
}
\begin{document}
\centering
\noindent
\begin{tabular}{L{.03}|L{.5}}
\toprule
\textbf{\#} & \textbf{w/ phantom}\\
\midrule
1 &\leavevmode\mbox{\ttfamily\phantom{xxx}\mail{[email protected]}}\\
2 &\leavevmode\mbox{\ttfamily\phantom{xx}\mail{[email protected]}}\\
3 &\leavevmode\mbox{\ttfamily\mail{[email protected]}}\\
\bottomrule
\end{tabular}
\begin{tabular}{L{.03}|L{.5}}
\toprule
\textbf{\#} & \textbf{w/ phantom}\\
\midrule
1 &\leavevmode\mbox{\ttfamily{\color{red}xxx}\mail{[email protected]}}\\
2 &\leavevmode\mbox{\ttfamily{\color{red}xx}\mail{[email protected]}}\\
3 &\leavevmode\mbox{\ttfamily\mail{[email protected]}}\\
\bottomrule
\end{tabular}
\end{document}
您遇到了以下问题:
根据问题所选答案tabularx 里面的 \phantom您必须添加一个
\leavemode
命令才能在表格中使用幻影。您的命令有
\mail
一些创建额外空间的标记。您可以使用
\mbox
以避免邮件的 heperref 函数占用过多空间。输出:
答案2
对于任何想要简单解决上述问题的人来说,只需采取两个步骤:
- 在命令定义中添加
%
换行符mail
以避免多余的空格; - 用于
leavevmode
水平堆叠块并防止表格中出现换行。
演示
平均能量损失
\documentclass{article}
\usepackage{mwe}
\usepackage{booktabs}
\usepackage{array}
\usepackage{hyperref}
\usepackage{xcolor}
\newcolumntype{L}[1]{>{\raggedright\arraybackslash}p{#1\textwidth}}
\newcommand{\mail}[1]{%
\href{mailto:#1}{#1}%
}
\begin{document}
\centering
\noindent
\begin{tabular}{L{.03}|L{.5}}
\toprule
\textbf{\#} & \textbf{w/ phantom \& leavevmode} \\
\midrule
1 & {\leavevmode\ttfamily\phantom{xxx}\mail{[email protected]}} \\
2 & {\leavevmode\ttfamily\phantom{xx}\mail{[email protected]}} \\
3 & {\leavevmode\ttfamily\mail{[email protected]}} \\
\bottomrule
\end{tabular}
\end{document}