Problemas ao usar linhas vazias no comando de troca de cores

Problemas ao usar linhas vazias no comando de troca de cores

Esta é uma continuação da minha perguntaAlterar o sistema de cores de parte de um documento?

Tentei resolver esse problema definindo o documento como azul (ou qualquer cor que eu queira), depois voltando as cores ao normal para meu ambiente específico e, em seguida, voltando-as. Isto fica mais claro a partir de um exemplo. No entanto, meu problema não é com a troca de cores, ela funciona perfeitamente.

Meu problema é que não consigo usar nenhuma linha em branco no meu novo comando!

Por exemplo

\iSol{ \lipsum[75] } 

funciona perfeitamente, mas,

\iSol{ \lipsum[75]

\lipsum[66] }

Reclama de um desaparecimento par. Alguma ideia de como posso corrigir o comando para poder usar linhas em branco nele?

Código

\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}

Responder1

Enquanto LaTeX2e \newcommandpor padrão cria \longmacros (enquanto a versão com estrela cria macros curtas), \DeclareDocumentCommandfaz o oposto. Para permitir parágrafos em um argumento macro, você deve prefixar o especificador com a +, no seu caso:

\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
}

Cuidado, essa \DeclareDocumentCommandé a xparseversão do \def, portanto não verificará se a macro existe. \NewDocumentCommandé a versão mais segura.

informação relacionada