1

I'm writing my thesis report in which citations inserted through citep en citet are blue, and the output of the citeauthor-command is the regular text color. I've achieved this using a combination of these answers.

The problem is that this negatively interferes with these commands in a separate environment (sidebox, created using tcolorbox) I've defined, and overrules specific hypersetup-settings defined for that environment. As the name suggests, I'm using this environment as a sort of sidebar/box, in which I'd like all the text (including citations) to be another color.

MWE

\documentclass[12pt]{report}

\usepackage[colorlinks=true, citecolor=blue]{hyperref}
\usepackage{natbib}
\usepackage{filecontents}
\usepackage{xpatch}
\usepackage[most]{tcolorbox}

\xpretocmd{\citeauthor}{\hypersetup{citecolor=black}}{}{}
\xpretocmd{\citeyear}{\hypersetup{citecolor=black}}{}{}
\xpretocmd{\citep}{\hypersetup{citecolor=blue}}{}{}
\xpretocmd{\citet}{\hypersetup{citecolor=blue}}{}{}

\newcounter{sidebox}
\newenvironment{sidebox}[1]{
\def\sideboxtext{Box}
\hypersetup{citecolor=red}

\newtcolorbox[use counter=sidebox]{sideboxinner}{%
    empty,title={#1},
    minipage boxed title,
    boxed title style={empty,size=minimal,toprule=0pt,top=4pt,left=3mm,overlay={}},
    enlarge left by=8mm,
    width=\textwidth-8mm,
    coltitle=red,coltext=red,fonttitle=,fontupper=\hypersetup{linkcolor=red,citecolor=red}\small,fontlower=\hypersetup{linkcolor=red,citecolor=red},
    before=\par\medskip\noindent,parbox=false,boxsep=0pt,left=2.5mm,right=0mm,top=2pt,breakable,pad at break=0mm,
    before upper=\csname @totalleftmargin\endcsname0pt 
    }
\begin{sideboxinner}
    }
    {
\end{sideboxinner}}

\begin{filecontents}{main.bib}
@article{myref,
    title = {Fancy title},
    journal = {Journal of Fancy Publications},
    author = {Jane Dee and John Doe},
    year = {2017},
    pages = {293--311},
}
\end{filecontents}

\begin{document}

The work by \citeauthor{myref} was a fancy read~\citep{myref}. \citet{myref} was published in the text-coloured year of \citeyear{myref}.

\begin{sidebox}{This is a sidebox}
The work by \citeauthor{myref} was a fancy read~\citep{myref}. \citet{myref} was published in the text-coloured year of \citeyear{myref}.
\end{sidebox}

\bibliographystyle{plainnat}
\bibliography{main}

\end{document}

This compiles to the following, in which the citations in the sidebox are blue and black. enter image description here

Removing the xpretocmd-lines yields this, in which the sidebox is formatted as I want it, but citeauthor and citeyear in the regular text are blue -- rather than black. enter image description here

Attempts so far

Before coming here, I've made a few attempts to solve this on my own. As I reckon the xpretocmd-commands affect all citep-, citet-, citeauthor- and citeyear-commands, I've tried to redefine these conditionally, based on the environment (using \@currenvir, which is tcb@savebox for the sidebox, by the way). That doesn't work, presumably because these commands are executed in the preamble -- where the environment of use is still unknown.

I've also tried to redefine these xpretocmd-commands at the start of the sidebox-code (where I also change the hyperref-settinsg) and reset them at the end, without success.

Question

My question is fairly straightforward: how can I achieve the desired situation?

2

Not change hypersetup, but define new color which can be changed:

\documentclass[12pt]{report}

\usepackage[colorlinks=true, citecolor=blue]{hyperref}
\usepackage{natbib}
\usepackage{filecontents}
\usepackage{xpatch}
\usepackage[most]{tcolorbox}

\colorlet{citeauthor}{black}
\colorlet{citeyear}{black}
\colorlet{citep}{blue}
\colorlet{citet}{blue}

\xpretocmd{\citeauthor}{\hypersetup{citecolor=citeauthor}}{}{}
\xpretocmd{\citeyear}{\hypersetup{citecolor=citeyear}}{}{}
\xpretocmd{\citep}{\hypersetup{citecolor=citep}}{}{}
\xpretocmd{\citet}{\hypersetup{citecolor=citet}}{}{}

\newcounter{sidebox}
\newenvironment{sidebox}[1]{
\def\sideboxtext{Box}
\hypersetup{citecolor=red}

\newtcolorbox[use counter=sidebox]{sideboxinner}{%
    empty,title={#1},
    minipage boxed title,
    boxed title style={empty,size=minimal,toprule=0pt,top=4pt,left=3mm,overlay={}},
    enlarge left by=8mm,
    width=\textwidth-8mm,
    coltitle=red,coltext=red,fonttitle=,fontupper=\small,fontlower=,
    before=\par\medskip\noindent,parbox=false,boxsep=0pt,left=2.5mm,right=0mm,top=2pt,breakable,pad at break=0mm,
    before upper=\csname @totalleftmargin\endcsname0pt 
    }
\begin{sideboxinner}
\colorlet{citeauthor}{red}
\colorlet{citeyear}{red}
\colorlet{citep}{red}
\colorlet{citet}{red}
    }
    {
\end{sideboxinner}}

\begin{filecontents}{main.bib}
@article{myref,
    title = {Fancy title},
    journal = {Journal of Fancy Publications},
    author = {Jane Dee and John Doe},
    year = {2017},
    pages = {293--311},
}
\end{filecontents}

\begin{document}

The work by \citeauthor{myref} was a fancy read~\citep{myref}. \citet{myref} was published in the text-coloured year of \citeyear{myref}.

\begin{sidebox}{This is a sidebox}
The work by \citeauthor{myref} was a fancy read~\citep{myref}. \citet{myref} was published in the text-coloured year of \citeyear{myref}.
\end{sidebox}

The work by \citeauthor{myref} was a fancy read~\citep{myref}. \citet{myref} was published in the text-coloured year of \citeyear{myref}.

\bibliographystyle{plainnat}
\bibliography{main}

\end{document}

enter image description here

0

Based on the answer by @coffeetable, I've found the solution below. This is slightly different (rather than defining the colors in the sideboxinner-part, I do so higher up), in order not to indent the first line of the sidebox-content. Adding %-signs and/or removing linebreaks (based on this thread) didn't solve that problem.

In any case, this removes the need for the additional hypersetup-command.

\documentclass[12pt]{report}

\usepackage[colorlinks=true, citecolor=blue]{hyperref}
\usepackage{natbib}
\usepackage{filecontents}
\usepackage{xpatch}
\usepackage[most]{tcolorbox}

\colorlet{citeauthor}{black}
\colorlet{citeyear}{black}
\colorlet{citep}{blue}
\colorlet{citet}{blue}

\xpretocmd{\citeauthor}{\hypersetup{citecolor=citeauthor}}{}{}
\xpretocmd{\citeyear}{\hypersetup{citecolor=citeyear}}{}{}
\xpretocmd{\citep}{\hypersetup{citecolor=citep}}{}{}
\xpretocmd{\citet}{\hypersetup{citecolor=citet}}{}{}

\newcounter{sidebox}
\newenvironment{sidebox}[1]{
\def\sideboxtext{Box}
\colorlet{citeauthor}{red}
\colorlet{citeyear}{red}
\colorlet{citep}{red}
\colorlet{citet}{red}

\newtcolorbox[use counter=sidebox]{sideboxinner}{%
    empty,title={#1},
    minipage boxed title,
    boxed title style={empty,size=minimal,toprule=0pt,top=4pt,left=3mm,overlay={}},
    enlarge left by=8mm,
    width=\textwidth-8mm,
    coltitle=red,coltext=red,fonttitle=,fontupper=\small,fontlower=,
    before=\par\medskip\noindent,parbox=false,boxsep=0pt,left=2.5mm,right=0mm,top=2pt,breakable,pad at break=0mm,
    before upper=\csname @totalleftmargin\endcsname0pt 
    }
\begin{sideboxinner}
    }
    {
\end{sideboxinner}}

\begin{filecontents}{main.bib}
@article{myref,
    title = {Fancy title},
    journal = {Journal of Fancy Publications},
    author = {Jane Dee and John Doe},
    year = {2017},
    pages = {293--311},
}
\end{filecontents}

\begin{document}

The work by \citeauthor{myref} was a fancy read~\citep{myref}. \citet{myref} was published in the text-coloured year of \citeyear{myref}.

\begin{sidebox}{This is a sidebox}
The work by \citeauthor{myref} was a fancy read~\citep{myref}. \citet{myref} was published in the text-coloured year of \citeyear{myref}.
\end{sidebox}

The work by \citeauthor{myref} was a fancy read~\citep{myref}. \citet{myref} was published in the text-coloured year of \citeyear{myref}.

\bibliographystyle{plainnat}
\bibliography{main}

\end{document}

enter image description here

Your Answer

By clicking “Post Your Answer”, you agree to our terms of service, privacy policy and cookie policy

Not the answer you're looking for? Browse other questions tagged or ask your own question.