我的文件中有很多 LaTeX 文本重复,因为文件必须使用 pdflatex 进行编译,并且tex4ht
不text4ht
支持所有软件包,所以我的文件中到处都是这样的内容
\ifdefined\HCode
\begin{A}
same stuff
\end{A}
\else
\begin{B}
same stuff
\end{B}
\fi
这两种情况的区别仅在于环境,其中的内容是相同的。所以我必须same stuff
在两个地方复制粘贴,并记住如果我在一个地方更改了它,也要在另一个地方更改它。
我不能把上面的写成
\ifdefined\HCode
\begin{A}
\else
\begin{B}
\fi
same stuff
\ifdefined\HCode
\end{A}
\else
\end{B}
\fi
因为这通常不会编译。我想做的似乎是不可能的,就是定义variable
在普通编程语言中所谓的 a 并分配给variable
我想要的任何 latex 文本,告诉 Latex 不要处理它或查看它,而只是将其作为文字保留,然后替换环境中的变量,如下所示
\def\myVariable{ whatever I want goes here } %tell Latex not to look at it
现在我可以写
\ifdefined\HCode
\begin{A}
\myVariable
\end{A}
\else
\begin{B}
\myVariable
\end{B}
\fi
现在代码没有重复。但我不知道如何做上述事情。
这必须在文档内部完成,而不是在序言中。所以我可以在变量使用的位置旁边分配它。
这是 MWE
\documentclass[12pt]{book}%
\usepackage{amsmath}
\usepackage{breqn}
\begin{document}
\ifdefined\HCode
\begin{equation}
3\frac{d^{2}y}{dt^{2}}+2\frac{dy}{dt}+y\left( t\right) = u(t)
\end{equation}
\else
\begin{dmath*}
3\frac{d^{2}y}{dt^{2}}+2\frac{dy}{dt}+y\left( t\right) = u(t)
\end{dmath*}
\fi
\end{document}
我试过: \let
并且\def
,这些都没有用。我试过了\newcommand
\documentclass[12pt]{book}%
\usepackage{amsmath}
\usepackage{breqn}
\begin{document}
\newcommand{\variable}{3\frac{d^{2}y}{dt^{2}}+2\frac{dy}{dt}+y\left( t\right) = u(t)}
\ifdefined\HCode
\begin{equation}
\variable
\end{equation}
\else
\begin{dmath*}
\variable
\end{dmath*}
\fi
\end{document}
但它给出了一个错误Undefined control sequence. \variable
附言:上述错误是由于打字错误造成的。请忽略。已更正打字错误。
问题是:如何更改上述内容,以免在两个地方重复使用代码?
答案1
不完全像您建议的那样,但这\newif
是一个简单的解决方案。您的A
和B
环境被类似定理的示范环境所取代。
编辑:根据评论的建议进行了放大。保留旧图。
\documentclass{article}
\usepackage{amsmath}
\begin{document}
\def\myVariable{ whatever I want goes here } %tell Latex not to look at it
Now I can write
\newif\ifHcode
\newtheorem{thm}{Theorem}
\newtheorem{lem}{Lemma}
%\ifdefined\HCode
\def\usemyVariable{
\ifHcode
\begin{thm}
\myVariable
\end{thm}
\else
\begin{lem}
\myVariable
\end{lem}
\fi
}
\usemyVariable
\Hcodetrue
\usemyVariable
\def\myVariable{3\frac{d^{2}y}{dt^{2}}+2\frac{dy}{dt}+y\left( t\right) = u(t)}
\def\usemyVariable{
\ifHcode
\begin{equation}
\myVariable
\end{equation}
\else
\begin{displaymath}
\myVariable
\end{displaymath}
\fi
}
\usemyVariable
\Hcodefalse
\usemyVariable
\end{document}
答案2
将测试放在文档主体之外:
\documentclass[12pt]{book}%
\usepackage{amsmath}
\ifdefined\HCode
\newenvironment{myequation}
{\begin{equation}}{\end{equation}\ignorespacesafterend}
\else
\usepackage{breqn}
\newenvironment{myequation}
{\begin{dmath*}}{\end{dmath*}\ignorespacesafterend}
\fi
\begin{document}
\begin{myequation}
3\frac{d^{2}y}{dt^{2}}+2\frac{dy}{dt}+y\left( t\right) = u(t)
\end{myequation}
\end{document}
答案3
注释 1——关于在文档环境主体的某处初始化但从文档环境主体的开头开始使用的“变量”:
使用 LaTeX2e-kernel 的基础结构来定义 \label..\ref- 机制并定义您自己的 - 引用将在 第二LaTeX 运行:
\documentclass[a4paper]{article}
\makeatletter
% !! In case you wish to use the hyperref-package, have the things
% !! between \makeatletter..\makeatother done _before_ loading the
% !! hyperref package.
\let\MySaved@setref=\@setref
\let\MySaved@newl@bel=\@newl@bel
\AtEndDocument{\let\MySaved@newl@bel=\@testdef}%
\newcommand\@currentphraselabel{}%
\newcommand\phraselabel[2]{%
\@bsphack
\protected@edef\@currentphraselabel{#2}%
\protected@write\@auxout{}{\string\newphraselabel{#1}{\@currentphraselabel}}%
\@esphack
}%
\newcommand*\newphraselabel{\MySaved@newl@bel{MyVar}}%
\DeclareRobustCommand\phraseref[1]{%
\expandafter\MySaved@setref\csname MyVar@#1\endcsname\@firstofone{#1}%
}%
\makeatother
%\usepackage{hyperref}
\begin{document}
This is the value of myVariable: \phraseref{myVariable}.
This is when myVariable gets initialized.
\phraselabel{myVariable}{MyVariable's value}%
This is again the value of myVariable: \phraseref{myVariable}.
\end{document}
注释2--关于使用环境时的分叉:
根据所定义的 HCode 定义要分叉的环境:
\documentclass[a4paper]{article}
\makeatletter
\newcommand\AtIfDefindeHCode{%
\ifdefined\HCode\expandafter\@firstoftwo\else\expandafter\@secondoftwo\fi
}%
\newcommand\envA{This is start of env in case HCode defined.}
\@ifundefined{endenvA}%
{\def\endenvA{This is end of env in case HCode defined.}}%
{\newcommand\endenvA{}}% <- trigger the error-message
\newcommand\envB{This is start of env in case HCode undefined.}
\@ifundefined{endenvB}%
{\def\endenvB{This is end of env in case HCode undefined.}}%
{\newcommand\endenvB{}}% <- trigger the error-message
\newenvironment{AorB}%
{\AtIfDefindeHCode{\envA}{\envB}}%
{\AtIfDefindeHCode{\endenvA}{\endenvB}}%
\makeatother
\begin{document}
\def\HCode{defined}%
\begin{AorB}
Some text in AorB.
\end{AorB}
\let\HCode=\BIZarrEaNDThereFOreHOpeFullyUnDEFiNED
\begin{AorB}
Some text in AorB.
\end{AorB}
\end{document}
乌尔里希·迪茨