我想输入 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 输出:
而复制/粘贴输出(在 Adobe 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}