Dies ist eine Folgefrage zu der Frage:Wie kann ich einen Befehl und sein wörtliches Äquivalent in einer Umgebung setzen?
Natürlich wäre es auch nützlich, Umgebungen zu handhaben. Ich stelle mir so etwas vor:
Syntax
\begin{environment}{env_name}{env_description}
\begin{env_name}
some example text
\end{env_name}
\end{environment}
Gewünschte Ausgabe
Die Ausgabe sähe etwa so aus:
Pseudocode
\documentclass{article}
\usepackage{fontspec}
\usepackage{menukeys}
\usepackage{xparse}
\usepackage{booktabs} % Adds support for \toprule, \midrule, \bottomrule
\usepackage{array} % https://tex.stackexchange.com/a/4816/13552
\newcolumntype{$}{>{\global\let\currentrowstyle\relax}}
\newcolumntype{^}{>{\currentrowstyle}}
\newcommand{\rowstyle}[1]{\gdef\currentrowstyle{#1}%
#1\ignorespaces
}
\setlength\parindent{0pt}
% Some flipped out function called "environment" goes here:
% \NewEnviron is what I would normally use to capture the body in \BODY
% \NewDocumentEnvironment is what egreg used for the command solution.
\begin{document}
\begin{environment}{mytab}{This environment is a wrapper for the standard latex table environment. This environment is a wrapper for the standard latex table environment. You can optionally adjust the alignment of columns by adding parameters. (e.g. \string$c\string^c\string^c)}
\begin{mytab}
\headrowstart
col1 & col2 & col3 \\
\headrowend
dat1 & dat2 & dat3 \\
dat4 & dat5 & dat6 \\
\end{mytab}
\end{environment}
\end{document}
Aktualisierung 27-04-2015
Ich habe der Präambel den folgenden Code hinzugefügt:
\ExplSyntaxOn
\NewDocumentEnvironment{environment}{vvv}
{
\tl_set:Nn \l_env_argument_i_tl { #1 }
\tl_set:Nn \l_env_argument_ii_tl { #2 }
\tl_set:Nn \l_env_argument_iii_tl { #3 }
\par\vspace{\baselineskip}
\noindent
\bgroup\ttfamily
\l_env_argument_i_tl\par
\ignorespaces
\egroup
\par\nopagebreak
\noindent
\l_env_argument_iii_tl \par\noindent % Description
\textbf{Example:~}\par
\texttt
{
\string\begin\string{\l_env_argument_i_tl\string}\l_env_argument_ii_tl\\
\string\end\string{\l_env_argument_i_tl\string}
}
\\*
}
{
\tl_set_rescan:NnV \l_env_argument_tl {} \l_env_argument_i_tl
\tl_if_blank:VF \l_env_argument_ii_tl
{
\tl_set_rescan:NnV \l_env_temp_tl {} \l_env_argument_ii_tl
\tl_put_right:Nx \l_env_argument_tl { { \exp_not:V \l_env_temp_tl } }
}\\*
}
\tl_new:N \l_env_argument_tl
\tl_new:N \l_env_argument_i_tl
\tl_new:N \l_env_argument_ii_tl
\tl_new:N \l_env_argument_iii_tl
\tl_new:N \l_env_temp_tl
\cs_generate_variant:Nn \tl_set_rescan:Nnn { NnV }
\ExplSyntaxOff
Die Ausgabe sollte ein Beispiel für wörtlichen Code und ein Beispiel dafür sein, wie er im gesetzten Zustand aussehen würde.
Problem beim automatischen Einfügen von Code:
%\begin{environment}{<environment>}{<any parameters>}{<description>}
\begin{environment}{tabular}{{ccc}}{This is the standard latex environment for tabular data.}
% \begin{tabular}{ccc} <-- This gets automatically inserted
col1 & col2 & col3 \\
dat1 & dat2 & dat3 \\
% \end{tabular} <-- This gets automatically inserted
\end{environment}
Aufgrund der Schwierigkeiten beim Erfassen des Textes innerhalb der Umgebung habe ich über eine andere Option nachgedacht, nämlich die tabellarischen Daten in arg3 einzufügen und die Beschreibung in den Hauptteil der Umgebung zu verschieben (sie einfach auszutauschen).Wenn ich das mache, habe ich immer noch das Problem, dass ich \begin{
+ arg1 + }
+ arg2 + arg3 + \end{
+ arg1 + hinzufügen muss }
. Ich bin nicht sicher, wie ich das machen soll.
Antwort1
Ich habe den Code des OP nicht verwendet, zeige hier aber, wie die filecontents
Pakete etoolbox
und verbatimbox
verwendet werden können, um sowohl Code zu setzen als auch den Quellcode anzuzeigen, alles in einer Umgebung.
BEARBEITET, um es in eine einzelne Umgebung einzubinden, unter Verwendung der Syntax
\begin{enviro}{name}{description}
<code>
\end{enviro}
Ich lege die Ausgabe in meinem eigenen vereinfachten Format fest, das jedoch an das Format des Benutzers angepasst werden kann.
Ich sollte anmerken, dass ich \verbfilebox
die Codeauflistung festgelegt habe, die mir \fbox
das Ergebnis ermöglicht und Seitenumbrüche mitten im Code verhindert. Wenn man Code so gestalten möchte, dass Seiten umgebrochen werden können (mithilfe einer vollständigen \textwidth
Auflistung), könnte man \verbfilenobox
stattdessen das Makro verwenden.
\documentclass[12pt]{article}
\usepackage{filecontents,verbatimbox}
\usepackage{etoolbox}
\parindent 0pt
\makeatletter
\newenvironment{enviro}[2]
{\gdef\environame{#1}\gdef\envirodescription{#2}%
\@tempswafalse\filec@ntents{tmp}}
{\endfilecontents}
\makeatother
\newcommand\setenviro{
\textbf{\Large\environame:}\par\bigskip
\envirodescription\par\bigskip
\textbf{Example:} \input{tmp}\par\bigskip
\textbf{Code:}
\verbfilebox[\footnotesize]{tmp}
\fbox{\theverbbox}
}
\AfterEndEnvironment{enviro}{\setenviro}
\begin{document}
\begin{enviro}{tabular}{This is the standard latex environment for
tabular data.}
\begin{tabular}{|c|c|}
\hline
My & tabular\\
\hline
is & here\\
\hline
\end{tabular}
\end{enviro}
\end{document}
Antwort2
Ich bezweifle, dass dies das ist, was der OP will, aber ab und zu ist es schön, etwas (fast) von Grund auf zu tun und mich davon zu überzeugen, dass all die Zeit, die ich vor Jahren mit der Lektüre von Stephan von BechtolsheimsTeX in der Praxiswar nicht völlig verschwendet.
Beachten Sie, dass die Verwendung von \scantokens
voraussetzt, dass etex
verwendet wird.
\documentclass[border=10]{standalone}
\edef\vbatcatcode{\the\catcode`\@}
\catcode`\@=11
\def\vb@other{11}
\def\vb@active{13}
\def\vb@makeactive#1{\catcode`#1=\vb@active\relax}
\def\vb@makeother#1{\catcode`#1=\vb@other\relax}
\def\vb@dospecials{\let\vb@do=\vb@makeother%
\vb@do\\\vb@do\{\vb@do\}\vb@do\$\vb@do\#\vb@do\%\vb@do\^\vb@do\&\vb@do\~\vb@do\_}
{\catcode`\|=\catcode`\\
\catcode`\[=\catcode`\{
\catcode`\]=\catcode`\}
\vb@makeactive\^^M%
\vb@makeother\{%
\vb@makeother\}%
\vb@makeother\\%
|long|gdef|vb@collect^^M#1^^M\end{vb}[|vb@collected[#1]]%
]
{\vb@makeactive\ %
\vb@makeactive\^^M%
\vb@makeactive\^^I%
\gdef\vb@dospaces{\vb@makeactive\ \def {\vb@typesetspace}}%
\gdef\vb@doreturns{\vb@makeactive\^^M\def^^M{\vb@typesetreturn}}%
\gdef\vb@dotabs{\vb@makeactive\^^I\def^^I{\vb@typesettab}}%
\gdef\vb@returnspacing{%
\vb@makeactive\ \def {\space}%
\vb@makeactive\^^M\def^^M{\space}%
\vb@makeactive\^^I\def^^I{\space}}%
}
\def\vb@typesetspace{\ }
\long\def\vb@typesetreturn{\par\leavevmode}
\def\vb@typesettab{\ \ \ }
\def\vb#1#2{%
\def\vbname{#1}%
\def\vbdescription{#2}%
\begingroup%
\vb@dospaces%
\vb@doreturns%
\vb@dotabs%
\vb@dospecials%
\vb@collect%
}
\long\def\vb@collected#1{%
\gdef\vbexamplecode{\vb@dospaces\vb@doreturns\vb@dotabs#1}%
\endgroup%
\gdef\vbexecutedcode{\begingroup\vb@returnspacing\scantokens{#1\ignorespaces}\endgroup}%
\vbtypeset%
\vbend%
}
\def\vbend{%
\endgroup%
}
\catcode`\@=\vbatcatcode%
\newdimen\vbtmpdimen
\def\vbtypeset{%
\parindent=0pt
\begin{minipage}[t]{0.75in}\tt\vbname\end{minipage}%
\vbtmpdimen=\linewidth
\advance\vbtmpdimen-0.75in%
\begin{minipage}[t]{\vbtmpdimen}
\vbdescription\medskip\par\leavevmode
Example:
\medskip\par\leavevmode%
\vbexecutedcode%
\medskip\par\leavevmode
{\ttfamily\vbexamplecode}%
\end{minipage}%
\bigskip}
\begin{document}
\begin{vb}{tabular}
{This is the standard latex environment for tabular data.}
\begin{tabular}{ccc}
\hline
col1 & col2 & col3 \\
\hline
dat1 & dat2 & dat3 \\
dat4 & dat5 & dat6 \\
\hline
\end{tabular}
\end{vb}
\end{document}
Antwort3
Meine Lösung verwendet die temporäre externe Datei. Die Daten werden im Verbatim-Modus gescannt und in der Datei gespeichert. Anschließend wird die Datei mit normalen Catcode-Einstellungen gelesen, sodass die normale Ausgabe gedruckt wird. Anschließend werden die Daten aus dem Verbatim-Scan für die Verbatim-Ausgabe verwendet.
\documentclass{article}
\newwrite\verbfile
\def\setverb{\def\do##1{\catcode`##1=12}\dospecials}
\def\begverbA{\bgroup \setverb \obeyspaces \obeylines \begverbB}
\def\tmp#1{}\edef\bslash{\expandafter\tmp\string\\}
\edef\tmp{\def\noexpand\begverbB##1\bslash end\string{showcode\string}##2}
\tmp{\egroup\par
%%% normal output:
{\newlinechar=`\^^J \obeylinesJ
\immediate\openout\verbfile=verb-tmp.tex
\immediate\write\verbfile{#1}%
\immediate\closeout\verbfile}
\input verb-tmp.tex
\par\bigskip
%%% verbatim output:
{\tt\def\par##1{\endgraf\ifx##1\relax\else\leavevmode\fi##1}
\obeylines#1\relax}%
\par\medskip
\end{showcode}%
}
{\catcode`\^^M=\active \gdef\obeylinesJ{\catcode`\^^M\active \def^^M{^^J}}}
\newenvironment{showcode}[2]{%
\par\medskip
\bgroup\leftskip=5em
\noindent\llap{\tt#1\quad}#2\par
\bigskip\begverbA}
\egroup
\begin{document}
\begin{showcode}{tabular}
{This is the standard \LaTeX\ environment for tabular data.}
\begin{tabular}{ccc}
\hline
col1 & col2 & col3 \\
\hline
dat1 & dat2 & dat3 \\
dat4 & dat5 & dat6 \\
\hline
\end{tabular}
\end{showcode}
\end{document}
Antwort4
Verwenden eines Hacks des example
Pakets.
Es könnte eine gute Idee sein, direkt Ihr eigenes Paket zu erstellen, example.sty
anstatt die Präambel auf diese Weise durcheinander zu bringen.
\documentclass[a4paper]{article}
\usepackage[margin=3cm]{geometry,xcolor}
\usepackage{example,booktabs}
\parindent0pt\parskip0em
\columnsep .1\textwidth
\makeatletter
\chardef\escape=0
\chardef\open=1
\chardef\close=2
\chardef\letter=11
\chardef\other=12
\chardef\uscode=\catcode`\_
\catcode`\_=\letter
\def\example#1#2{
\fboxsep1em
\fboxrule0em
\bigskip{\color{blue!10}\rule{\textwidth}{2.5pt}}\par\bigskip
\noindent\hangindent.2\linewidth\makebox[.2\linewidth][l]{\texttt{#1}}%
#2\par\bigskip\noindent{\color{blue!10}\rule{\textwidth}{2pt}}\par\bigskip
\par
\immediate\openout\example_file\example_name
\begingroup
\@makeother\"\let\do\@makeother \dospecials
\obeylines \obeyspaces
\@ignoretrue \copy_line
}
\def\ExampleSet{%
\noindent\fcolorbox{red}{cyan!10}{
\begin{minipage}[t]{.4\textwidth}%
\hrule height\z@
\def\markboth##1##2{}%
\def\markright##1{}%
\def\addcontentsline##1##2##3{}%
\input \example_name
\par
\hrule height\z@
\end{minipage}}}
\def\ExampleVerb{%
\noindent\fcolorbox{red}{green!10}{%
\begin{minipage}[t]{.4\textwidth}%
\hrule height\z@
\begingroup
\small
\parindent\z@
\rightskip\@flushglue
\@makeother\"\@verbatim
\frenchspacing \@vobeyspaces \@vobeytabs
\input \example_name
\endverbatim
\endgroup
\hrule height\z@
\end{minipage}}}
\makeatother
\begin{document}
\begin{example}{tabular}{This is the standard \LaTeX\ environment for tabular data, with optional horizontal and vertical lines.}
%\begin{example}
\begin{tabular}{ccc}
\toprule
col1 & col2 & col3 \\
\midrule
dat1 & dat2 & dat3 \\
dat4 & dat5 & dat6 \\
\bottomrule
\end{tabular}
\end{example}
\begin{example}{quote}{This is a standard \LaTeX\ environment for quotes.}
This is main text.
\begin{quote}
This is a quote
\end{quote}
This is again the main text.
\end{example}
\end{document}