CTeX-org / ctex-kit

Macro Packages and Scripts for Chinese TeX users
978 stars 124 forks source link

ctex: 兼容 titletoc #472

Closed muzimuzhi closed 4 years ago

muzimuzhi commented 4 years ago

ctex 与 titletoc 共用时,会造成 <sec name><sec title> 部分出现重合,见 https://github.com/stone-zeng/fduthesis/issues/73#issuecomment-491567024 。一个 mwe(源自 https://github.com/stone-zeng/fduthesis/issues/73#issuecomment-491596140 )是

\documentclass{ctexbook}
\usepackage{titletoc}

\begin{document}
\tableofcontents
\chapter{测试}
\chapter{测试}
\end{document}

ctex 因为修改了 \numberline 的定义,所以(很可能)需要为所有控制目录样式的包做兼容。目前兼容了 tocloft,没有兼容 titletoc。我在这篇文章的末尾提供了一种实现。

\documentclass{ctexbook}
\usepackage{titletoc}

%% make ctex works with titletoc
\makeatletter
\ExplSyntaxOn
\group_begin:
\char_set_catcode_other:N \#
\use:n
  {
    \group_end:
    \ctex_preto_cmd:NnnTF \numberline { \ExplSyntaxOff }
      { \CTEX@toc@width@n {#1} }
      { }
      { \ctex_patch_failure:N \numberline }
    \@ifpackageloaded { titletoc }
      { }
      {
        \ctex_at_end_package:nn { titletoc }
          {
            \ctex_preto_cmd:NnnTF \numberline
              { \char_set_catcode_letter:n { 64 } }
              { \CTEX@toc@width@n {#1} }
              { }
              { \ctex_patch_failure:N \numberline }
          }
      }
  }
\ExplSyntaxOff
\makeatother

\begin{document}
\tableofcontents
\chapter{测试}
\chapter{测试}
\end{document}

文章是大半年前写的,我自己也需要时间重新理解。

muzimuzhi commented 4 years ago

看起来只需要在 https://github.com/CTeX-org/ctex-kit/blob/dacf77095131f169f361437bf4e22dab830a3e7d/ctex/ctex.dtx#L8271-L8292 里为 titletoc 增加一段相同的 patch 即可。