在 mecard 中使用 CJK 文本会产生错误

在 mecard 中使用 CJK 文本会产生错误

我正在尝试使用它\psbarcode来生成名称字段中包含 CJK 字符的 MECARD QR 码。

文本:

\documentclass[12pt]{memoir}
\usepackage{CJKutf8}

\usepackage{pstricks}
\usepackage{pst-barcode}

\begin{document}

%\CJKfamily{goth}

\textbf{\begin{CJK}{UTF8}{min}トレバー・アレクサンダー\end{CJK}}\
\rule{75mm}{1mm}\\
\begin{minipage}[t]{30mm}
    \vspace{-1mm}%
    \begin{pspicture}(30mm,30mm)
        % The MECARD format is used to exchange contact information. More information at:
        % http://www.nttdocomo.co.jp/english/service/imode/make/content/barcode/function/application/addressbook/index.html
        \psbarcode{MECARD:N:トレバー・アレクサンダー;EMAIL:[email protected];URL:http://www.whatsmyip.org;;}{eclevel=L width=1.181 height=1.181}{qrcode}
    \end{pspicture}
\end{minipage}
\end{document}

上面的 MECARD 部分不起作用,但文档前面的 CJK 文本起作用。具体来说,pdflatex(从 Gummi 调用)的错误是:

This is pdfTeX, Version 3.1415926-2.4-1.40.13 (TeX Live 2012/Debian)
...
/home/trevor/Dropbox/.temp2.tex.swp:18: Undefined control sequence.
\GenericError  ...                                
                                                #4  \errhelp \@err@     ...
l.18 ...=L width=1.181 height=1.181 parse}{qrcode}

如果您将名称字段替换为二维码,则N:Aso Taro;可以正确生成二维码。这相关主题有类似的问题,但提问者的问题是在 ASCII 集内,而回答者建议使用行parse中的选项psbarcode,然后将每个字符指定为 ASCII 代码值。

是否可以改为输入 UTF-8 代码值?我尝试N:\x30C8;在选项中使用十六进制解析,但也没有用。我可以用任何方式将 CJK 文本放入这些字段中。

编辑:MECARD 本身肯定接受了这一点,正如 NTTdocomo 示例所示这里(为清晰起见添加了换行符):

MECARD:
N:ドコモ,太郎;
SOUND:ト゛コモタロウ;
TEL:03XXXXXXXX;
TEL:090XXXXXXXX;
EMAIL:docomotaro@△△.□□□.co.jp;
EMAIL:docomo.taro.△△@docomo.ne.jp;

答案1

pst-barcode需要纯文本字符串。UTF-8 在 8 位 TeX 中由包含代码的活动字符支持。代码可以是任何内容,例如,它从包含它的字体的正确位置中选择字符。如果字符串是由 TeX 排版的,则需要的额外内容会干扰 pst-barcode仅将纯文本字符串转换为条形码。由于您的输入编码已经是正确的编码(UTF-8),因此\detokenize可用于将输入字符串转换为没有活动字符的文本字符串:

\documentclass[12pt]{memoir}
\usepackage{CJKutf8}

\usepackage{pstricks}
\usepackage{pst-barcode}

\begin{document}

%\CJKfamily{goth}

\textbf{\begin{CJK}{UTF8}{min}トレバー・アレクサンダー\end{CJK}}\\

\rule{75mm}{1mm}\\
\begin{minipage}[t]{30mm}
    \vspace{-1mm}%
    \begin{pspicture}(30mm,30mm)
        % The MECARD format is used to exchange contact information. More information at:
        % http://www.nttdocomo.co.jp/english/service/imode/make/content/barcode/function/application/addressbook/index.html
        \psbarcode{\detokenize{MECARD:N:トレバー・アレクサンダー;EMAIL:[email protected];URL:http://www.whatsmyip.org;;}}{eclevel=L width=1.181 height=1.181}{qrcode}
    \end{pspicture}
\end{minipage}
\end{document}

结果

顺便说一句,如果字符串包含~(例如在 URL 中),那么这通常也是一个活动字符。它会被转换为\protect \unhbox \voidb@x \penalty \@M \ {}。这也发生在 XeTeX 或 LuaTeX 中。\detokenize{~}\string~解决了这个问题,因为这两个构造都将活动字符转换~为不可扩展的字符。

修复错误pst-barcode.tex

软件包pst-barcode将扩展的字符串放入括号内的 PostScript 字符串中。因此,不匹配的左括号或右括号会破坏 PostScript 代码。在 PostScript 字符串的括号形式中,反斜杠是转义字符。以下修复使用\pdfescapestringif available(pdfTeX 两种模式 PDF 和 DVI)并使用软件包,pdfescape否则也可以与没有 e-TeX 扩展的 iniTeX 一起使用。在这两种情况下,通过转义有问题的字符,字符串都会转换为有效的 PostScript 字符串。

\usepackage{pst-barcode}

\makeatletter
\@ifundefined{pdfescapestring}{%
  \usepackage{pdfescape}% LaTeX
  % \input pdfescape.sty\relax % plain TeX
  \newcommand*{\psbarcode@escape}[1]{%
    \EdefEscapeString\psbarcode@string{#1}%
  }%
}{%
  \newcommand*{\psbarcode@escape}[1]{%
    \edef\psbarcode@string{\pdfescapestring{#1}}%
  }%
}
\def\psbarcode@i#1#2#3{%
  \begin@SpecialObj
  \psbarcode@escape{#1}%
  \addto@pscode{
    gsave
    \psk@barcode@rotate\space
    \psk@barcode@scalex\space \psk@barcode@scaley\space
    \psk@barcode@transx\space \psk@barcode@transy\space
    translate scale rotate
    0 0 moveto (\psbarcode@string) (#2) /#3 /uk.co.terryburton.bwipp findresou
    grestore
  }%
  \end@SpecialObj%
  \ignorespaces%
}
\makeatother

答案2

运行你的文档xelatex它就会起作用。

在此处输入图片描述

相关内容