表 p 列中的幻像空间不一致

表 p 列中的幻像空间不一致

后续行动此主题

问题

phantomp似乎具有不一致的行为,这取决于在表中的列类型中使用时是否在调用之前打印某些内容。

  • 单独使用时,它会产生换行符;
  • 当突出显示时,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}

您遇到了以下问题:

  1. 根据问题所选答案tabularx 里面的 \phantom您必须添加一个\leavemode命令才能在表格中使用幻影。

  2. 您的命令有\mail一些创建额外空间的标记。

  3. 您可以使用\mbox以避免邮件的 heperref 函数占用过多空间。

    输出:

在此处输入图片描述

答案2

对于任何想要简单解决上述问题的人来说,只需采取两个步骤:

  1. 在命令定义中添加%换行符mail以避免多余的空格;
  2. 用于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}

相关内容