我正在尝试使用它\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 字符串的括号形式中,反斜杠是转义字符。以下修复使用\pdfescapestring
if 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
它就会起作用。