是否存在“仅视觉空白”之类的东西?

是否存在“仅视觉空白”之类的东西?

我想输入 IBAN,并注意到如果我输入,DE12\,1234\,5678\,9123\,4567\,89我会得到我期望的半空格,但是当复制粘贴时,空格会消失(如评论中所述,这似乎取决于查看器。我正在使用 Sumatra)。这真的很好。但是,如果我想在打印输出中获得完整的空格,但在复制时没有空格,我该怎么办?在 CSS 中,您可以直观地分开(DE12 1234 5678 9123 4567 89打印​​输出时产生),但将数字保留在一起(DE12123456789123456789复制粘贴时产生)。

首先我的 MWE:

% arara: pdflatex

\documentclass{article}

\begin{document}
DE12\,1234\,5678\,9123\,4567\,89

DE12 1234 5678 9123 4567 89
\end{document}

我尝试了其他空格,例如\~甚至\,\,,但它们总是会导致肢解的复制粘贴结果。

周围是否有这样的空白,可以满足我的要求?也许(作为额外功能),有一个\IBAN{DE12123456789123456789}可以自动进行分隔的宏会很酷(规则很简单:从左到右四个一组)。

答案1

对最初的误解进行了全面修改。

再次编辑以提供两种方法:(1)\IBAN{}将无空格的字符串转换为有空格的 IBAN 号码,但仍可复制/粘贴而不带空格,以及(2)\ncs{}获取填充空格的字符串并使其复制/粘贴时删除空格。

宏观\IBAN{}方法

根据 Juri 的建议,这个方法有效。我已编辑了语法,以自动化该过程,例如。\IBAN{DE12123456789123456789}下面的 MWE 检查以确保只有少量数字的异常 IBAN 不会破坏算法。

\documentclass{article}
\usepackage{accsupp}
\def\IBAN#1{%
  \unskip\def\viewed{}\IBANhelper#1\relax\relax\relax\relax\relax%
  \BeginAccSupp{method=escape,ActualText=#1}%
    \viewed%
  \EndAccSupp{}%
}
\def\IBANhelper#1#2#3#4#5\relax{\edef\viewed{\viewed\ #1#2#3#4}%
  \if\relax#5\relax\else\IBANhelper#5\relax\relax\relax\relax\fi}
\begin{document}
The IBAN number is \IBAN{DE12123456789123456789} if I am not mistaken.

The IBAN number is \IBAN{DE121} if I am not mistaken.

The IBAN number is \IBAN{DE12} if I am not mistaken.

The IBAN number is \IBAN{DE1} if I am not mistaken.

The IBAN number is \IBAN{DE} if I am not mistaken.

The IBAN number is \IBAN{D} if I am not mistaken.

The IBAN number is \IBAN{} if I am not mistaken.
\end{document}

以下是 PDF 输出:

在此处输入图片描述

而复制/粘贴输出(在 Adob​​e Acrobat 中)是

The IBAN number is DE12123456789123456789 if I am not mistaken.
The IBAN number is DE121 if I am not mistaken.
The IBAN number is DE12 if I am not mistaken.
The IBAN number is DE1 if I am not mistaken.
The IBAN number is DE if I am not mistaken.
The IBAN number is D if I am not mistaken.
The IBAN number is if I am not mistaken.

我认为这个问题,从 PDF 复制文本时是否可以提供替代文本?,教会我accsupp


\ncs{}(无复制空间) 宏:

这种方法可能具有更普遍的实用性,因为它适用于除 IBAN 号码之外的其他内容。在这种情况下,空格填充的字符串按原样排版;但是,PDF 中的复制/粘贴文本会删除所有空格。

\documentclass{article}
\usepackage{accsupp}
\newcommand\ncs[1]{%
  \def\actual{}\ncshelper#1 \relax%
  \BeginAccSupp{method=escape,ActualText=\actual}%
    #1%
  \EndAccSupp{}%
}
\def\ncshelper#1 #2\relax{\edef\actual{\actual#1}%
  \if\relax#2\relax\else\ncshelper#2\relax\fi}
\begin{document}
I like the palindrome \ncs{a man a plan a canal panama}.
\end{document}

它按预期显示,

在此处输入图片描述

但复制/粘贴为

I like the palindrome amanaplanacanalpanama .

答案2

我准备了expl3史蒂文的答案的一个版本,其中同时包含\IBAN\ncs

\documentclass{article}
\usepackage{xparse,accsupp}
\ExplSyntaxOn

\cs_new_protected:Npn \larifari_iban:n #1
  {
    \int_zero:N \l_tmpa_int
    \tl_map_inline:nn { #1 }
      {
        ##1
        \int_incr:N \l_tmpa_int
        \bool_if:nT
          {
            \int_compare_p:n { \int_mod:nn { \l_tmpa_int } { 4 } = 0 }
            &&
            \int_compare_p:n { \l_tmpa_int < \tl_count:n { #1 } }
          }
          { ~ }
      }
  }

\NewDocumentCommand \IBAN { m }
  {
    \BeginAccSupp{method=escape,ActualText=#1}
      \larifari_iban:n { #1 }
    \EndAccSupp{}
  }

\cs_new_protected:Npn \larifari_ncs:Nn #1#2
  {
    \tl_set:Nn #1 { #2 }
    \tl_remove_all:Nn #1 { ~ }
  }

\tl_new:N \l_larifari_ncs_tl

\NewDocumentCommand \ncs { m }
  {
    \larifari_ncs:Nn \l_larifari_ncs_tl { #1 }
    \BeginAccSupp{method=escape,ActualText=\tl_use:N \l_larifari_ncs_tl}
      #1
    \EndAccSupp{}
  }

\ExplSyntaxOff
\begin{document}
The IBAN number is \IBAN{DE12123456789123456789} if I am not mistaken.

The IBAN number is \IBAN{DE121} if I am not mistaken.

The IBAN number is \IBAN{DE12} if I am not mistaken.

The IBAN number is \IBAN{DE1} if I am not mistaken.

The IBAN number is \IBAN{DE} if I am not mistaken.

The IBAN number is \IBAN{D} if I am not mistaken.

The IBAN number is \IBAN{} if I am not mistaken.

I like the palindrome \ncs{a man a plan a canal panama}.
\end{document}

相关内容