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}