
Я пытаюсь переписать среду боковой панели, которая у меня есть, которая основана на wrapfigure
и т. п., во что-то основанное на tcolorbox
. Однако я столкнулся с парой проблем.
Для справки, вот моя старая среда:
\makeatletter
\newenvironment*{sidebar}[3][0.5\textwidth]
{
% less vertical margin around wrapfigures
\setlength{\intextsep}{0pt}
\colorlet{savedcolor}{inline code}
\colorlet{inline code}{inline code inverted}
\renewcommand{\dummy}{#1}
\wrapfigure{#2}{#1}
\renewcommand{\@currentlabel}{#3}
\renewcommand{\@currentlabelname}{#3}
\phantomsection
\rule{#1}{1pt}
\rule{#1}{18pt}
\vspace{-18pt}
\centerline{\textcolor{white}{#3}}
\vspace{5pt}
\footnotesize
\leftskip=5pt
\rightskip=5pt
\setlength{\parskip}{0.2cm}
\setlength{\parindent}{0pt}
% restore the inline code color for the body of the bar
\colorlet{inline code}{savedcolor}
}
{
\leftskip=0pt
\rightskip=0pt
\setlength{\parindent}{0pt}
\rule{\dummy}{1pt}
\rule[.19in]{\dummy}{2.5pt}
\endwrapfigure
}
\makeatother
Это работает, но это далеко не красиво. Вот почему я ищу использование tcolorbox
, так как я имел хороший успех, используя его в других контекстах.
Вот MWE того, что у меня есть на данный момент:
% !TEX program = xelatex
\documentclass{scrbook}
\usepackage{wrapfig}
\usepackage{graphicx}
\usepackage{xcolor}
\usepackage{tcolorbox}
\usepackage{listings}
\usepackage{blindtext}
\usepackage{hyperref}
\definecolor{inline code}{RGB}{194,61,53}
\definecolor{inline code inverted}{RGB}{193,153,151}
\newcommand*{\code}{\lstinline[basicstyle=\fontsize{9}{11}\ttfamily\color{inline code},keywordstyle=\color{inline code},stringstyle=\color{inline code},keepspaces=true]}
\newtcolorbox{cbar}[2][]{
parbox=false, % normal paragraph spacing
height from=2.5cm to 100cm,
halign=justify,
sharp corners,
colframe=black,
colback=black!15!white,
fontupper=\tiny,% font size for body of text
title=\scriptsize \textsc{#2},
#1
}
\begin{document}
\begin{cbar}[label=lab:testing]{Test Bar (some \code{Code})}
Here is a test bar with some \code{Code}.
\blindtext
\end{cbar}
Hello, \code{code}. And here is a reference to \ref{lab:testing}, which has name \nameref{lab:testing}.
\end{document}
И вот как это выглядит:
Мои проблемы:
- Я не знаю, как заставить ссылки работать так, как они работали в моей предыдущей среде. Как вы видите, моя старая среда использует
renewcommand
иphantomsection
для назначения текста метки, так что ссылки на боковую панель просто выводили заголовок боковой панели (используяnameref
). Я понятия не имею, как добиться того же сnewtcolorbox
. - Аналогично, я раньше использовал
colorlet
команду для переопределения цвета для вывода встроенного кодаcode
. Я подозреваю, что это вариация вопроса 1, но я не уверен, гдепомещатьэту логику я теперь используюnewtcolorbox
.
Кто-нибудь может помочь?
решение1
Для решения проблемы с неверной nameref
ссылкой используйте \nameref
ключ, который можно установить на заголовок.
Поскольку счетчик не задействован, label=
нет захвата, чтобы сделать что-то полезное. Предоставить auto counter
как параметр init нового определения коробки.
\documentclass{scrbook}
\usepackage{wrapfig}
\usepackage{graphicx}
\usepackage{xcolor}
\usepackage{tcolorbox}
\usepackage{listings}
\usepackage{blindtext}
\usepackage{hyperref}
\definecolor{inline code}{RGB}{194,61,53}
\definecolor{inline code inverted}{RGB}{193,153,151}
\newcommand*{\code}{\lstinline[basicstyle=\fontsize{9}{11}\ttfamily\color{inline code},keywordstyle=\color{inline code},stringstyle=\color{inline code},keepspaces=true]}
\newtcolorbox[auto counter]{cbar}[2][]{
parbox=false, % normal paragraph spacing
height from=2.5cm to 100cm,
halign=justify,
sharp corners,
colframe=black,
colback=black!15!white,
fontupper=\tiny,% font size for body of text
title={\thetcbcounter\ \scriptsize \textsc{#2}},
nameref={\scriptsize \textsc{#2}},
#1
}
\begin{document}
\begin{cbar}[label=lab:testing]{Test Bar (some \code{Code})}
Here is a test bar with some \code{Code}.
\blindtext
\end{cbar}
Hello, \code{code}. And here is a reference to \ref{lab:testing}, which has name \nameref{lab:testing}.
\end{document}