
Это продолжение моего вопросаИзменить цветовую систему для части документа?
Я попытался решить эту проблему, определив документ как синий (или любой другой цвет, который я хочу), затем переключив цвета обратно на обычные для моей конкретной среды, а затем переключив их обратно. Это яснее на примере. Однако моя проблема не в переключении цветов, оно работает отлично.
Моя проблема в том, что я не могу использовать пустые строки в своей новой команде!
Например
\iSol{ \lipsum[75] }
работает отлично, но,
\iSol{ \lipsum[75]
\lipsum[66] }
Жалуется на отсутствие par
. Есть идеи, как исправить команду, чтобы можно было использовать в ней пустые строки?
Код
\documentclass{article}
% Uses the default color profile from UiT's official guidelines
\usepackage{xcolor,lipsum}
\usepackage{xparse,etoolbox}
\newtoggle{isLF}
\definecolor{UiT-main}{HTML}{003349}
\definecolor{UiT-red}{HTML}{CB333B}
\definecolor{UiT-blue}{HTML}{007396}
\definecolor{UiT-cyan}{HTML}{59BEC9}
\definecolor{UiT-orange}{HTML}{F2A900}
% The green is not default, but very useful
\colorlet{UiT-green}{green!50!black}
\colorlet{UiT-solution}{black}
\colorlet{UNI-default}{.}
\colorlet{UNI-current}{UNI-default}
\colorlet{UNI-monochrome}{black!50!white}
\newcommand{\resetUiTcolors}{
\definecolor{UiT-main}{HTML}{003349}
\definecolor{UiT-red}{HTML}{CB333B}
\definecolor{UiT-blue}{HTML}{007396}
\definecolor{UiT-cyan}{HTML}{59BEC9}
\definecolor{UiT-orange}{HTML}{F2A900}
% The green is not default, but very useful
\colorlet{UiT-green}{green!50!black}
}
\newcommand{\monoUiTcolors}{
\colorlet{UNI-monochrome}{black!50!white}
\colorlet{UiT-solution}{black}
\colorlet{UiT-main}{UNI-monochrome}
\colorlet{UiT-red}{UNI-monochrome}
\colorlet{UiT-blue}{UNI-monochrome}
\colorlet{UiT-cyan}{UNI-monochrome}
\colorlet{UiT-orange}{UNI-monochrome}
% The green is not default, but very useful
\colorlet{UiT-green}{UNI-monochrome}
}
\newcommand{\UNIfullcolor}[1]{
\colorlet{UNI-default}{.}
\resetUiTcolors
\resetUNIhypersetup
\color{UiT-solution}
#1
\monoUiTcolors
\monoUNIhypersetup
\color{UNI-default}
}
\DeclareDocumentCommand{\iSol}{m G{}}{
\iftoggle{isLF}{
\UNIfullcolor{#1}
}{#2}
}
% Hyperlenker og klikkbare lenker.
\RequirePackage{hyperref}
\hypersetup{
pdftoolbar=true, % show Acrobat’s toolbar?
pdfmenubar=false, % show Acrobat’s menu?
pdffitwindow=false, % window fit to page when opened
pdfstartview={FitH}, % fits the width of the page to the window
linktoc=all, % Link all the things in the toc
colorlinks=true, % false: boxed links; true: colored links
linkcolor=black, % color of internal links (change box color with linkbordercolor)
citecolor=UiT-cite, % color of links to bibliography
filecolor=UiT-orange, % color of file links
urlcolor=UiT-url % color of external links
}
\newcommand{\resetUNIhypersetup}{%
\hypersetup{
colorlinks=true, % false: boxed links; true: colored links
linkcolor=black, % color of internal links (change box color with linkbordercolor)
citecolor=UiT-cite, % color of links to bibliography
filecolor=UiT-orange, % color of file links
urlcolor=UiT-url % color of external links
}%
}
\newcommand{\monoUNIhypersetup}{%
\hypersetup{
colorlinks=true, % false: boxed links; true: colored links
linkcolor=UNI-monochrome, % color of internal links (change box color with linkbordercolor)
citecolor=UNI-monochrome, % color of links to bibliography
filecolor=UNI-monochrome, % color of file links
urlcolor=UNI-monochrome % color of external links
}%
}
\begin{document}
\color{blue}
\lipsum[5]
\settoggle{isLF}{true}
% this works
\iSol{\lipsum[75]}
% this dont
%\iSol{\lipsum[75]
%
%\lipsum[66]}
\lipsum[66]
\end{document}
решение1
В то время как in LaTeX2e
\newcommand
по умолчанию создает \long
макросы (в то время как версия со звездочкой создает короткие), \DeclareDocumentCommand
делает наоборот. Чтобы разрешить абзацы в аргументе макроса, вы должны префикс спецификатора +
, в вашем случае:
\DeclareDocumentCommand{\iSol}{+m G{}}{% <-- don't forget this
\iftoggle{isLF}{% <-- don't forget this
\UNIfullcolor{#1}% <-- don't forget this
}{#2}% <-- don't forget this
}
Имейте в виду, что \DeclareDocumentCommand
это xparse
версия \def
, поэтому она не будет проверять наличие макроса. \NewDocumentCommand
— это более безопасная версия.