我想建立一個接收參數和可選參數的環境,第一個參數將是標題,兩個可選參數將決定標題是否應該向左對齊或居中加號(如果標題想要)被添加到目錄中。
我的這段程式碼附帶一個可選參數(感謝@egreg),所以我喜歡針對兩個可選參數的情況進行修改:
\makeatletter
\newenvironment{something}[2][c]
{\begin{\csname #1@somethingtitle\endcsname}
\bfseries #2
\end{\csname #1@somethingtitle\endcsname}}
{\par\addvspace{\topsep}}
\newcommand\l@somethingtitle{flushleft}
\newcommand\c@somethingtitle{center}
\makeatother
提前致謝。
我聽從了建議蒂皮姆透過添加以下內容
\if\detokenize{C}\detokenize{#1}\relax
\addcontentsline{toc}{chapter}{#2}
\fi
\if\detokenize{L}\detokenize{#1}\relax
\addcontentsline{toc}{chapter}{#2}
\fi
答案1
這是一個提供兩個可選參數和一個強制標題的選項:
\documentclass{article}
\makeatletter
\newcommand{\something@aux@A}[1][c]{%
\def\something@halign{#1}%
\something@aux@B%
}
\newcommand{\something@aux@B}[2][y]{%
\expandafter\begin\expandafter{\csname\something@halign @somethingtitle\endcsname}
\csname phantomsection\endcsname% If you're using hyperref
\bfseries #2
\expandafter\end\expandafter{\csname\something@halign @somethingtitle\endcsname}
\def\something@toc{#1}
\ifx\something@toc\something@toc@y
\addcontentsline{toc}{section}{#2}%
\fi
\par\addvspace{\topsep}
}
\newenvironment{something}
{\something@aux@A}
{}
\newcommand{\l@somethingtitle}{flushleft}
\newcommand{\c@somethingtitle}{center}
\newcommand{\r@somethingtitle}{flushright}
\def\something@toc@y{y}
\makeatother
\begin{document}
\tableofcontents
\begin{something}{titleA}
Here is something without any optional argument.
\end{something}
\begin{something}[l]{titleB}
Here is something with a single optional argument.
\end{something}
\begin{something}[r][n]{titleC}
Here is something with two optional arguments.
\end{something}
\end{document}
關鍵是使用輔助巨集來捕獲參數,然後將它們儲存起來以供其他地方使用。
環境something
的第一的可選參數指定水平對齊方式。這第二指定條目是否應出現在目錄中,後面接著強制標題。