我正在为自定义教科书类别设计布局,但在让这个环境按我喜欢的方式运行时遇到了问题。
这是我当前的工作布局:
我希望能够创建一个环境,使小页面位于图像的左侧,并且我可以根据需要在它上面填充文本。我尝试使用该environ
包来执行此操作,但尽管进行了多次调整,布局仍然不起作用。
这是我的页面布局:
我希望左侧\minipage
使用边注空间,右侧小页面使用正文。
我尝试使用下面的代码,但它似乎不起作用。
\documentclass{book}
\let\cleardoublepage\clearpage
\usepackage{tikz}
\usepackage[explicit]{titlesec}
\usepackage[strict]{changepage}
\usepackage{calc}
\usepackage{environ}
\usepackage[
left=2.25in,
right=0.75in,
top=1.25in,
bottom=1.25in,
marginparwidth=1.75in,
marginparsep=.25in,
asymmetric]{geometry}
\NewEnviron{myfig}[2]{
\begin{adjustwidth}{-2.0in}{0.25in}
\begin{table}[h]
\centering
\makebox[0pt][c]{\parbox{\textwidth}{%
\colorbox{lightgray}{
\begin{minipage}{2.0in}
#1\\#2
\end{minipage}}
\colorbox{cyan}{
\begin{minipage}{\textwidth}
\BODY
\end{minipage}}
}}
\end{table}
\end{adjustwidth}
}
\makeatletter
\titleformat{\chapter}
{\normalfont\sffamily\Huge\scshape}
{}{0pt}
{\thispagestyle{empty} % Remove page number on new chapters
\begin{tikzpicture}[remember picture,overlay]
\node[yshift=-3cm] at (current page.north west)
{\begin{tikzpicture}[remember picture, overlay]
\draw[fill=cyan] (0,-1) rectangle
(25cm,3cm);
\draw[fill=cyan] (0,-24) rectangle
(25cm,-25cm);
\ifttl@label% <---------------------- Added condition on \ifttl@label
\node[anchor=west,xshift=.21\paperwidth,yshift=-.01\paperheight,rectangle]
{\color{white}\LARGE CHAPTER \Huge\thechapter};
\fi% <------------------------------- end condition on \ifttl@label
\node[anchor=west,xshift=.21\paperwidth,yshift=-.065\paperheight,rectangle]
{\color{cyan}\Huge\MakeUppercase{#1}};
\end{tikzpicture}
};
\end{tikzpicture}
}
\makeatother
\begin{document}
\chapter{test}
\begin{myfig}{Label}{This is a description}
foobar
\end{myfig}
\end{document}
上述 mwe 产生以下内容:
编辑:感谢 Sašo Živanović 的帮助,它已经接近正常工作了……但我想指出一个对齐问题:我希望图形的文本描述显示在图像的左上角。截至目前,它悬停在左下角。
答案1
这是你想要的结果吗?
这是通过以下环境定义实现的myfig
(其余代码相同)。
\newbox\myfigbox
\newenvironment{myfig}[1][]{%
{\noexpandarg\IfStrEq{#1}{}{}{%
\raisebox{-\height}{\makebox[0pt][r]{%
\colorbox{lightgray}{
\begin{minipage}[t]{2.0in}
\formatlabeldesc#1\formatlabeldesc
\end{minipage}%
}%
\hspace{0.4em}% set as needed
}}%
}}%
\setbox\myfigbox=\hbox\bgroup
\begin{minipage}[t]{\textwidth}%
}{%
\end{minipage}\egroup
\raisebox{-\height}{\colorbox{cyan}{\box\myfigbox}}%
}
\def\formatlabeldesc#1\\#2\formatlabeldesc{\textbf{#1}\\\textit{#2}}
为了回应评论,我已将上述定义中的参数签名从两个强制参数更改为单个可选参数。 (因此,如果没有给出标签和描述,一切都很好。)关于 keyval 请求,我会说它只会迫使您输入更多内容:我建议只需用 分隔标签和描述\\
。 (如果您需要它,这也可以让您完全控制格式。)
\begin{document}
\chapter{test}
\begin{myfig}[Label\\This is a description]
foobar
\end{myfig}
\begin{myfig}
foobar
\end{myfig}
\end{document}
花式键值版本(使用pgfkeys
):
\usepackage{pgfkeys}
\pgfkeys{/myfig/.cd,
label/.store in=\myfiglabel,
description/.store in=\myfigdescription
}
\newbox\myfigbox
\newenvironment{myfig}[1][]{%
{\noexpandarg\IfStrEq{#1}{}{}{%
\def\myfiglabel{}\def\myfigdescription{}%
\pgfkeys{/myfig/.cd,#1}%
\raisebox{-\height}{\makebox[0pt][r]{%
\colorbox{lightgray}{
\begin{minipage}[t]{2.0in}
\textbf{\myfiglabel}%
\expandarg\IfStrEq{\myfiglabel}{}{}{\IfStrEq{\myfigdescription}{}{}{\\}}%
\textit{\myfigdescription}%
\end{minipage}%
}%
\hspace{0.4em}% set as needed
}}%
}}%
\setbox\myfigbox=\hbox\bgroup
\begin{minipage}[t]{\textwidth}%
}{%
\end{minipage}\egroup
\raisebox{-\height}{\colorbox{cyan}{\box\myfigbox}}%
}
% ...
\begin{myfig}[label=Label,description=This is a description]
foobar
\end{myfig}