3

In the following code, it seems that using \edef with CJK contents may fail. (I used pdflatex, UTF8 encoding.)

\documentclass{article}
\usepackage{CJK}
\begin{document}
\begin{CJK*}{UTF8}{bsmi}
\newcommand{\tiangan}[1]{\ifcase #1%
\or甲\or乙\or丙\or丁\or戊\or己\or庚\or辛\or壬\or癸\fi}

\newcount\fuu\fuu=3
\def\ber{\romannumeral\fuu}
\fuu=4
\ber%iv
\edef\ber{\romannumeral\fuu}% successes in \edef-ining \ber as iv
%\show\ber
\fuu=5%iv
\ber%iv

\def\faa{三}
\def\bor{\faa}
\def\faa{四}
\bor%四
\edef\bor{\faa}% fails in \edef-ining \bor as 四
%\show\bor
\def\faa{五}
\bor%

\def\foo{3}
\def\bar{\tiangan{\foo}}
\def\foo{4}
\bar%丁
\edef\bar{\tiangan{\foo}}% fails in \edef-ining \bar as 丁
%\show\bar
\def\foo{5}
\bar%

\end{CJK*}
\end{document}

What is meant in the error message? How to \edefine a macro with CJK characters?


Addition on 18 July 2014

Thanks to egreg and Herbert. I tried \protected@edef but then \global fails.

\documentclass{article}
\usepackage{CJK}
\begin{document}
\begin{CJK*}{UTF8}{bsmi}
\newcommand{\tiangan}[1]{\ifcase #1%
\or甲\or乙\or丙\or丁\or戊\or己\or庚\or辛\or壬\or癸\fi}
\makeatletter

\def\ber{\romannumeral3}%iii
{%
  \global\edef\ber{\ber\romannumeral4}%iiiiv
  \show\ber
  \ber
}
\show\ber
\ber%iiiiv

\def\bar{\tiangan{3}}%丙
{%
  \global\protected@edef\bar{\bar\tiangan{4}}%丙丁
  \show\bar
  \bar%
}
\show\bar
\bar%丙

\end{CJK*}
\end{document}

How should I rewrite so that the effect of \protected@edef is global?

HYC
  • 329
  • 2
    It's not clear why you want to do that. However, \protected@edef should be what you're looking for. Remember \makeatletter (see http://tex.stackexchange.com/questions/8351/what-do-makeatletter-and-makeatother-do) – egreg Jul 16 '14 at 09:55
  • 2
    The global version of \protected@edef is called \protected@xdef (cf. \edef and \xdef). – Joseph Wright Jul 18 '14 at 07:10

1 Answers1

3

I have no idea what the cjk package does but you can use:

\makeatletter
\protected@xdef\bor{\faa}% doesn't fail in \edef-ining \bor as 四
\makeatletter

and also for the other \edef