tikz 讲座标题的模块化选项

tikz 讲座标题的模块化选项

我有一个用于讲座的设置,对于某些讲座,我如何才能将日期部分留空,并完全构建框架,而顶部没有间隙。任何帮助都将不胜感激。

\newcommand{\lec}[3]{
      \setcounter{chapter}{#1 - 1}
      \date{#2}
      \chapter[#3 - #2]{#3}
    }
    \let\Date\@date
    \def\chaptername{Lecture}
    \def\@makechapterhead#1{%
    \noindent\begin{tikzpicture}
    \node[draw, inner ysep=.3cm, color = RoyalPurple] (title) {\parbox{\dimexpr        \textwidth-.667em}{\centering \textcolor{black}{\textbf       {\Large\chaptername~\thechapter}\\
      \textit{#1}}}};
    \node[fill=white, right=2pt] at (title.north west)        {\footnotesize\@date};
    \end{tikzpicture}\par\bigskip
    }
    \makeatother
    
    \def\@makeschapterhead#1{%
    \noindent\begin{tikzpicture}
    \node[draw, inner ysep=.3cm, color = RoyalPurple] (title) {\parbox{\dimexpr        \textwidth-.667em-0.4pt}{\centering \textcolor{black}{
            \textit{\large #1}}}};
    \end{tikzpicture}\par\bigskip
    }
    \makeatother

在此处输入图片描述

基本上,我希望能够将 lec 命令的日期部分留空,并在这样做时完全构建框架。

\documentclass{book}
\RequirePackage[dvipsnames]{xcolor}

\RequirePackage{tikz}
\RequirePackage{pgfplots}
\newcommand{\lec}[3]{
    \setcounter{chapter}{#1 - 1}
    \date{#2}
    \chapter[#3 - #2]{#3}
  }


  \makeatletter
  \let\Date\@date
  \def\chaptername{Lecture}
  \def\@makechapterhead#1{%
  \noindent\begin{tikzpicture}
  \node[draw, inner ysep=.3cm, color = RoyalPurple] (title) {\parbox{\dimexpr        \textwidth-.667em}{\centering \textcolor{black}{\textbf       {\Large\chaptername~\thechapter}\\
    \textit{#1}}}};
  \node[fill=white, right=2pt] at (title.north west)        {\footnotesize\@date};
  \end{tikzpicture}\par\bigskip
  }
  \makeatother
  
  \def\@makeschapterhead#1{%
  \noindent\begin{tikzpicture}
  \node[draw, inner ysep=.3cm, color = RoyalPurple] (title) {\parbox{\dimexpr        \textwidth-.667em-0.4pt}{\centering \textcolor{black}{
          \textit{\large #1}}}};
  \end{tikzpicture}\par\bigskip
  }
  \makeatother

\begin{document}
    \lec{1}{6/2/13}{test}
    \lec{2}{}{test}
\end{document}

答案1

我可能会利用这个titlesec包并做这样的事情:

\documentclass{book}
\usepackage[dvipsnames]{xcolor}
\usepackage{tikz}
\usepackage[explicit]{titlesec}

\def\chaptername{Lecture}
\def\chapterdate{}
        
\NewDocumentCommand{\chaptertitlebox}{ m m }{%
    \begin{tikzpicture}
        \node[draw, inner sep=.3cm, draw=RoyalPurple, text width={\textwidth-2\pgflinewidth-.6cm}, align=center] (title) 
            {\textbf{\Large\chaptername~\thechapter} \\ \textit{#2}};
        \pgfmathparse{int(width{"#1"})}
        \ifnum\pgfmathresult=0\else
                \node[fill=white, right=2pt] at (title.north west)
                    {\footnotesize #1};
        \fi
    \end{tikzpicture}%
}

\titleformat{\chapter}[block]{}{}{0pt}{\chaptertitlebox{\chapterdate}{#1}}

\NewDocumentCommand{\lecture}{ O{} m }{
    \begingroup
        \def\chapterdate{#1}
        \chapter{#2}
    \endgroup
}

\begin{document}

    \lecture[21 June 2023]{The first lecture}
    
    Foo

    \lecture{The second lecture}

    Foo
    
\end{document}

在此处输入图片描述

在此处输入图片描述

或者将定义改为

\NewDocumentCommand{\lecture}{ m O{} m }{
    \begingroup
        \setcounter{chapter}{\numexpr#1-1\relax}
        \def\chapterdate{#2}
        \chapter[#3 -- #2]{#3}
    \endgroup
}

如果您想明确注明讲座编号,并在书签中保留日期。使用方法如下:\lecture{1}[21 June 2023]{The first lecture}

可能有几种方法可以检查 token 是否为空。在这里,我只是测量其内容的宽度。更具体地说,我测试包含存储在 token 中的文本的框的宽度是否为零,这意味着它是空的。


如果您想坚持自己的方法,可以执行以下操作:

\documentclass{book}
\usepackage[dvipsnames]{xcolor}
\usepackage{tikz}

\newcommand{\lec}[3]{
    \setcounter{chapter}{\numexpr#1-1\relax}
    \gdef\chapterdate{#2}
    \chapter[#3 - #2]{#3}
}

\usepackage{lipsum}

\makeatletter
\def\chaptername{Lecture}
\def\@makechapterhead#1{%
    \noindent\begin{tikzpicture}
        \node[draw, inner sep=.3cm, draw=RoyalPurple, text width={\textwidth-2\pgflinewidth-.6cm}, align=center] (title) 
            {\textbf{\Large\chaptername~\thechapter} \\ \textit{#1}};
        \pgfmathparse{int(width{"\chapterdate"})}
        \ifnum\pgfmathresult=0\else
            \node[fill=white, right=2pt] at (title.north west)
                {\footnotesize\chapterdate};
        \fi
    \end{tikzpicture}\par\bigskip
}
\makeatother

\begin{document}
    \lec{1}{6/2/13}{test}
    \lec{2}{}{test}
\end{document}

请注意以下几点:

  • 为了\setcounter{chapter}{#1-1}工作,您需要加载calc包。否则,您需要\setcounter{chapter}{\numexpr#1-1\relax}按照我的示例所示进行操作。
  • 我不会\date在这里(滥用)使用该命令。您可以定义自己的标记变量来存储章节标题的日期。您永远不知道哪个包可能想要访问存储在\@date,因此最好不要覆盖它。除此之外,您永远不会使用\Date,因此您实际上可以删除\let\Date\@date
  • 你有两个\makeatother\makeatletter你的代码中,但是只有一个。
  • \usepackage您更愿意\RequirePackage在用户文档中使用。后者是为包或文档类中的代码制作的。

相关内容