我有一个用于讲座的设置,对于某些讲座,我如何才能将日期部分留空,并完全构建框架,而顶部没有间隙。任何帮助都将不胜感激。
\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
在用户文档中使用。后者是为包或文档类中的代码制作的。