Titlesec 命令在文件结构上创建“书签”

Titlesec 命令在文件结构上创建“书签”

我使用titlesec软件包来自定义我的部分。当我使用命令\titleformat和时\titlespacing,会创建一个“书签”,因为我\section在这些命令中写入了内容,根据软件包文档,这是必要的。

TeXstudio界面截图

代码:

\documentclass[12pt,a4paper]{article}
\usepackage[utf8]{inputenc}
\usepackage{lipsum}
\usepackage{titlesec}
\titleformat{\section}[hang]{\normalfont\bfseries}{\thesection}{0.7em}{}[]
\titlespacing{\section}{0em}{1.5em}{1.5em}

\begin{document}
    \section{Section}
    \lipsum[1]
\end{document}

我正在使用 TeXstudio,在左侧的“结构”菜单中,您可以看到以下部分的前两个“书签”(不知道它的正确名称):\normalfont\bfseries0em,对应于\section代码中的前两个。如何在不创建这些书签的情况下使用这些命令?

答案1

你必须欺骗 TeXstudio 让它看不到内部\section\titleformat\titlespacing为此使用:

\expandafter\titleformat\expandafter{\csname section\endcsname}[hang]{\normalfont\bfseries}{\thesection}{0.7em}{}[]
\expandafter\titlespacing\expandafter{\csname section\endcsname}{0em}{1.5em}{1.5em}

答案2

首先,应该在\documentclass和之间禁用TeXStudio的结构制作过程。\begin{document}

以下代码对于特定应用程序来说可能有些过度,但它可以为更新选项管理提供思路titlesec

整修过程如下:

  1. 如果使用单个标记作为参数来调用\titleformat或,则假定它是或其他分段命令名称;-variant 被考虑在内。\titlespacing\section*

  2. 如果的参数\titlespacing不是单个标记,则为其构建一个命令名称,因为我们假设它是\titlespacing{section}或类似的;*-variant 被考虑在内。

  3. \titleformat如果(no )的参数*由多个标记组成,则它可以是单个分段命令名称(不带反斜杠)或一组键值选项。

  4. 在前一种情况下,如果扫描到未知的键,则假定它是一个分段命令名称,例如section:pass name=\section

  5. 密钥numberless按原样传递。

  6. 诸如这样的键值对name=\section按原样传递。

  7. 一个键值对,例如name=sectionpasses name=\section

在最后四种情况下,“传递”意味着\titleformat使用构建的参数调用原始参数。

\documentclass{article}
\usepackage{titlesec,letltxmacro,xparse}

\ExplSyntaxOn
\LetLtxMacro \titlesectitleformat \titleformat
\LetLtxMacro \titlesectitlespacing \titlespacing

\RenewDocumentCommand{\titlespacing}{sm}
 {
  \tl_if_single:nTF { #2 }
   {
    \tl_set:Nn \l_xtitlesec_arg_tl { #2 }
   }
   {
    \tl_set:Nx \l_xtitlesec_arg_tl { \exp_not:c { #2 } }
   }
  \IfBooleanTF{#1}
   {
    \exp_args:NNV \titlesectitlespacing * \l_xtitlesec_arg_tl
   }
   {
    \exp_args:NV \titlesectitlespacing \l_xtitlesec_arg_tl
   }
 }
\RenewDocumentCommand{\titleformat}{sm}
 {
  \IfBooleanTF{#1}
   {
    \tl_if_single:nTF { #2 }
     {
      \tl_set:Nn \l_xtitlesec_arg_tl { #2 }
     }
     {
      \tl_set:Nx \l_xtitlesec_arg_tl { \exp_not:c { #2 } }
     }
    \exp_args:NNV \titlesectitleformat * \l_xtitlesec_arg_tl
   }
   {\xtitlesec_titleformat:n { #2 }}
 }

\cs_new_protected:Npn \xtitlesec_titleformat:n #1
 {
  \tl_if_single:nTF { #1 }
   {% the argument is just '\levelname'
    \titlesectitleformat { #1 }
   }
   {% otherwise scan the argument more carefully
    \clist_clear:N \l_xtitlesec_options_clist
    \keys_set:nn { xtitlesec/titleformat } { #1 }
    \exp_args:NV \titlesectitleformat \l_xtitlesec_options_clist
   }
 }

\clist_new:N \l_xtitlesec_options_clist

\keys_define:nn { xtitlesec/titleformat }
 {
  name .code:n = 
   \tl_if_single:nTF { #1 }
    {% the value is just one token, assume it is '\levelcommand'
     \clist_put_right:Nn \l_xtitlesec_options_clist { name=#1 }
    }
    {% the value is multitoken, assume it is 'levelcommand'
     \clist_put_right:Nx \l_xtitlesec_options_clist { name=\exp_not:c { #1 } }
    }
  ,
  numberless .code:n =
   \clist_put_right:Nn \l_xtitlesec_options_clist { numberless }
  ,
  unknown .code:n =
   \clist_put_right:Nx \l_xtitlesec_options_clist { name=\exp_not:c { \l_keys_key_tl } }
 }

\ExplSyntaxOff

% example calls follow

\titleformat{\section}[hang]{\normalfont\bfseries}{\thesection}{0.7em}{}[]
\titleformat{section}[hang]{\normalfont\bfseries}{\thesection}{0.7em}{}[]
\titleformat{name=section,numberless}[hang]{\normalfont\bfseries}{\thesection}{0.7em}{}[]

\titlespacing*{\section}{0em}{1.5em}{1.5em}
\titlespacing*{section}{0em}{1.5em}{1.5em}

相关内容