在新命令中更改参数回忆录章节样式

在新命令中更改参数回忆录章节样式

我如何将下面的整个参数转换为%%%%a 中的整个参数\newcommand?我试过了,但出现错误。

\documentclass[a4paper]{memoir}
\usepackage[utf8]{inputenc}
\usepackage[T1]{fontenc}
\usepackage[brazil]{babel}
\usepackage{color,calc,graphicx,soul,fourier,lipsum}

%%%%%%%%%%%
% transform in newcommand
\makeatletter
  \newlength\dlf@normtxtw
  \setlength\dlf@normtxtw{\textwidth}
  \def\myhelvetfont{\def\sfdefault{mdput}}
  \newsavebox{\feline@chapter}
  \newcommand\feline@chapter@marker[1][4cm]{%
    \sbox\feline@chapter{%
      \resizebox{!}{#1}{\fboxsep=1pt%
      \colorbox{nicered}{\color{white}\bfseries\sffamily\thechapter}%
    }
  }%
  \rotatebox{90}{%
  \resizebox{%
    \heightof{\usebox{\feline@chapter}}+\depthof{\usebox{\feline@chapter}}}%
    {!}{\scshape\so\@chapapp}}\quad%
    \raisebox{\depthof{\usebox{\feline@chapter}}}{\usebox{\feline@chapter}}%
  }
  \newcommand\feline@chm[1][4cm]{%
    \sbox\feline@chapter{\feline@chapter@marker[#1]}%
    \makebox[0pt][l]{% aka \rlap
    \makebox[1cm][r]{\usebox\feline@chapter}%
    }
  }
  \makechapterstyle{daleif1}{
  \renewcommand\chapnamefont{\normalfont\Large\scshape\raggedleft\so}
  \renewcommand\chaptitlefont{\normalfont\huge\bfseries\scshape\color{nicered}}
  \renewcommand\chapternamenum{}
  \renewcommand\printchaptername{}
  \renewcommand\printchapternum{\null\hfill\feline@chm[2.5cm]\par}
  \renewcommand\afterchapternum{\par\vskip\midchapskip}
  \renewcommand\printchaptertitle[1]{\chaptitlefont\raggedleft ##1\par}
  }
\makeatother
%%%%%%%%%%%

% sugestion
% \newcommand{\mydaleif}
\mydaleif
\chapterstyle{daleif1}

\begin{document}

\chapter{Daleif1 Chapter Style}

\lipsum

\end{document}

答案1

以下是您“建议”的实现:

在此处输入图片描述

\documentclass[a4paper]{memoir}
\usepackage[utf8]{inputenc}
\usepackage[T1]{fontenc}
\usepackage[brazil]{babel}
\usepackage{color,calc,graphicx,soul,fourier,lipsum}

%%%%%%%%%%%
% transformed into a \newcommand
\makeatletter
\newcommand{\mydaleif}{%
  \newlength\dlf@normtxtw
  \setlength\dlf@normtxtw{\textwidth}
  \def\myhelvetfont{\def\sfdefault{mdput}}
  \newsavebox{\feline@chapter}
  \newcommand\feline@chapter@marker[1][4cm]{%
    \sbox\feline@chapter{%
      \resizebox{!}{##1}{\fboxsep=1pt%
      \colorbox{red}{\color{white}\bfseries\sffamily\thechapter}%
    }
  }%
  \rotatebox{90}{%
  \resizebox{%
    \heightof{\usebox{\feline@chapter}}+\depthof{\usebox{\feline@chapter}}}%
    {!}{\scshape\so\@chapapp}}\quad%
    \raisebox{\depthof{\usebox{\feline@chapter}}}{\usebox{\feline@chapter}}%
  }
  \newcommand\feline@chm[1][4cm]{%
    \sbox\feline@chapter{\feline@chapter@marker[##1]}%
    \makebox[0pt][l]{% aka \rlap
    \makebox[1cm][r]{\usebox\feline@chapter}%
    }
  }
  \makechapterstyle{daleif1}{
  \renewcommand\chapnamefont{\normalfont\Large\scshape\raggedleft\so}
  \renewcommand\chaptitlefont{\normalfont\huge\bfseries\scshape\color{red}}
  \renewcommand\chapternamenum{}
  \renewcommand\printchaptername{}
  \renewcommand\printchapternum{\null\hfill\feline@chm[2.5cm]\par}
  \renewcommand\afterchapternum{\par\vskip\midchapskip}
  \renewcommand\printchaptertitle[1]{\chaptitlefont\raggedleft ####1\par}
  }
}
\makeatother
%%%%%%%%%%%

\mydaleif
\chapterstyle{daleif1}

\begin{document}

\chapter{Daleif1 Chapter Style}

\lipsum

\end{document}

以下是一些注意事项:

  • 虽然宏的内部可能需要一些@使用,因此需要\makeatletter\makeatother修改对,但它们应该被使用外部宏定义。

  • 当你定义一个命令时之内另一个命令,并且“内部命令”将参数作为参数,则必须更改通过#1、等使用参数编号的方式。相反,您需要使用、等。#2##1##2

  • 宏旨在封装一些可能经常使用的命令组,因此通常采用参数或实参以允许将来进行修改。但您当前的 并非如此\mydaleif。因此,我认为这种宏没什么用,因为您在定义它之后立即调用它,并且它在定义之后没有多大用处。但是,这可能只是因为我不知道实际用例。

  • 在某个范围或组中定义命令有其局限性。例如,考虑两个宏:

    \newcommand{\mycmdone}{\newcommand{\testone}{Hello world 1.}}
    \newcommand{\mycmdtwo}{{\newcommand{\testtwo}{Hello world 2.}}}
    

    执行\mycmdone和然后\testone会打印Hello world 1.,而执行\mycmdtwo\testtwo会发出错误信号(Undefined control sequence),因为\testtwo是在组内定义的。请注意,\mycmdone字面上被替换,\newcommand{..}{...}\mycmdtwo被替换。对于或其他定义{\newcommand{..}{...}}也是如此。\renewcommand

由于您没有包括的定义nicered,我只是将其更改为red

相关内容