todonotes 中的 CJK

todonotes 中的 CJK

tl;dr:我正在寻找一种方法,将小型 CJK 文本片段放入 todonotes 中的其他英文文本中以及待办事项列表中,而不会在 pdftex 中过多地破坏我现有的大型文档。

现在说长话:我正尝试将 CJK 文本放入 todonote 中。通常,如果我只想要一小段 CJK 文本,我会像这样输入:

\begin{CJK}{UTF8}{gkai}木\protect\end{CJK}

但是在 todonote 里面使用这个说

! Argument of \reserved@a has an extra }.
! Paragraph ended before \reserved@a was complete.

经过一番搜索,我发现我需要保护 CJK 环境。只要我不想要,这个方法就没问题\listoftodos。所以我最终得到了这个 MNWE:

\documentclass[12pt, a4paper]{extreport}
\usepackage[utf8]{inputenc}
\usepackage[T1]{fontenc} 
\usepackage{lmodern}
\usepackage[colorinlistoftodos, textwidth=\marginparwidth]{todonotes}
\usepackage{CJKutf8}

\begin{document}
\listoftodos
\todo{\protect\begin{CJK}{UTF8}{gkai}木\protect\end{CJK}}

\end{document}

但现在却引发了错误:

! Package inputenc Error: Unicode char \u 8:木 not set up for use with LaTeX.

即使\begin{CJK}结尾\end{CJK} 都在.tdo文件中。

\contentsline {todo}{\color@box {}{orange}{\leavevmode {\color {orange}o}}\ 
\begin {CJK}{UTF8}{gkai}\GenericError {(inputenc) }{
 Package inputenc Error: Unicode char \u 8:木 not set up for use with LaTeX}{
 See the inputenc package documentation for explanation.}{
 Your command was ignored.
 \MessageBreak Type I <command> <return> to replace it with another command,
 \MessageBreak or <return> to continue without it.}
 \end {CJK}}{1}

有没有办法让它不使用 xelatex 来工作?我发现问题,答案似乎是\clearpage在之前使用\end{CJK},但如果我在 todonote 中这样做,我会得到

! Paragraph ended before \@dottedtocline was complete.

另一个变体,使用\usepackage[UTF8]{ctex}而不是\usepackage{CJKutf8}在我的 MWE 中工作,但在我真正想要使用它的相当大的文件中不起作用,抛出一个

tex capacity exceeded

我不明白的错误。所以,我现在没有主意了,如果能得到任何帮助,我将不胜感激。

答案1

一种方法是将其隐藏在一个强大的命令中(您需要在文档开始处的注释列表之前定义该命令)

在此处输入图片描述

[您需要删除.tdo之前尝试的所有损坏文件)

\documentclass[12pt, a4paper]{extreport}
\usepackage[utf8]{inputenc}
\usepackage[T1]{fontenc} 
\usepackage{lmodern}
\usepackage[colorinlistoftodos, textwidth=\marginparwidth]{todonotes}
\usepackage{CJKutf8}

\begin{document}
\DeclareRobustCommand\tdone{\begin{CJK}{UTF8}{gkai}木\protect\end{CJK}}

\listoftodos

\todo{\tdone}

\end{document}

相关内容