我正在创建一个课程,我想用它来创建自己的工作表。因此,我希望我教授的每门课程都有自己的信息文件,存储在文件中,在作业中,我可以使用诸如 之类的命令来访问该文件\course{\<course-number-term>}
。
因此,在我的课程序言文件中,我有以下课程代码:
\newcommand*{\course}[1]{\gdef\@course{#1}}
\input{\@course}
我知道第一行适用于我正在做的其他与文本相关的事情,第二行适用于与我的<course-number-term>.tex
文件位于同一文件夹中的其他静态文件,因此每个命令都独立工作,但不能一起工作,因为我收到错误
! undefined control sequence.
\@course -> \course
l.42 \input{\@course}
有没有办法将变量传递到\input
命令中,或者我注定缺乏灵活性?
- - - 编辑 - - -
感谢大家的评论和解决方案。我应该提到,我主要使用课程 tex 文件中序言部分的信息 — 因此,在之后输入这些信息\begin{document}
并不完全有效。
答案1
我还想到了另一种解决方案,实际上听起来更适合您的用例。它与我的第一个答案非常不同,所以我做了第二个答案。
通过将您教授的课程定义为课程选项,这似乎是实现这一目标的最佳方式。您实际上可以定义一堆这样的内容,并让它们同时更改。
我的课程
\NeedsTeXFormat{LaTeX2e}
\ProvidesClass{mycourses}[Sep 29, 2019 short description]
\newcommand{\mycourses@course}{}%
\newcommand{\mycourses@timeslot}{}%
\newcommand{\mycourses@day}{}%
\DeclareOption{ee433}{
\renewcommand\mycourses@course{ee433}
\renewcommand\mycourses@timeslot{11:00am}
\renewcommand\mycourses@day{T Th}
}
\DeclareOption{me390}{
\renewcommand\mycourses@course{me390}
\renewcommand\mycourses@timeslot{2:00pm}
\renewcommand\mycourses@day{M W F}
}
\DeclareOption{stats666}{
\renewcommand\mycourses@course{stats666}
\renewcommand\mycourses@timeslot{6:00am}
\renewcommand\mycourses@day{S Su}
}
\ProcessOptions\relax
\LoadClass[letterpaper,11pt]{report}
\newcommand{\course}{\mycourses@course}%
\newcommand{\timeslot}{\mycourses@timeslot}%
\newcommand{\theday}{\mycourses@day}%
\endinput
主文本
\documentclass[stats666]{mycourses}
\begin{document}
\course{} is taught at \timeslot{} on \theday{}
\end{document}
事实上,使用这种方法,由于当您输入类选项时,文档知道您要使用哪一个,因此实际上可以像这样在 .cls 文件中使用变量输入命令。
\DeclareOption{ee433}{
\input{ee433}
}
答案2
好的,再试一次。这是一个使用我之前两个答案中演示的技巧组合的解决方案。由于它们已经很完整了,我不想为更多的读者改变它们。
我们将定义三个文件:mycource.cls
、main.tex
和stats666.tex
我的课程目录
\NeedsTeXFormat{LaTeX2e}
\ProvidesClass{mycourses}[Sep 30, 2019 short description]
\LoadClass[letterpaper,11pt]{report}
\RequirePackage[utf8]{inputenc}
% \makeatletter
\newcommand{\coursename}[1]{\gdef\mycourses@coursename{#1}}%
\newcommand{\coursetime}[1]{\gdef\mycourses@coursetime{#1}}%
\newcommand{\getcoursevalue}[1]{%
\@ifundefined{mycourses@#1}%
{\PackageError{mycourses}{Variable '#1' undefined.}{}}%
{\csname mycourses@#1\endcsname}}
% \makeatother
\newcommand{\setclass}[1]{\coursename{#1}\include{\getcoursevalue{coursename}}}%here is where your magic happens
\endinput
主文本
\documentclass[12pt]{mycourses}
\setclass{stats666}%there is no way of getting around having this here
\begin{document}
\getcoursevalue{coursename} works.
\getcoursevalue{coursetime} works too.
\begin{tikzpicture}
\draw (0,0) -- (5,5);
\end{tikzpicture}
\end{document}
stats666.tex
\RequirePackage{tikz}
\coursetime{6:00 AM, Saturday and Sunday}
这演示了如何在里面添加前言材料classfilename.tex
以及在里面引用常用命令设置mycourses.cls
。
您甚至可以在每个课程中设立私人特定命令classfilename.tex
。
答案3
我对你的问题有点困惑,但如果我没记错的话,你不是想\input
添加更多前言吗?我认为这更符合你的要求?
这是我认为您正在尝试做的一个例子?
主文本
\documentclass[12pt]{report}
\usepackage[utf8]{inputenc}
\newcommand{\course}[1]{\gdef\@course{#1}}%you make new commands in your preamble (everything after \documentclass{myclass} and before your \begin{document}
\begin{document}
Hello I am Mr Soandso
\course{ee433}%Here you can call the command to store ee433 to the macro \@course
Some more friendly words.
\input{\@course}%Here you can reference \@course to input a like named file.
Then you can still use the name \@course any time you would like!
\end{document}
ee433.tex
Welcome to EE433
编辑 - - - - - - - - - - - - - - - - - - - - - - - - - -
这段代码有些问题,我正在尝试解决。虽然它确实按提供的方式工作,但出于某种原因,如果您尝试使用\newcommand{\varone}[1]{\gdef\@varone{#1}}
不同的名称创建第二个代码,然后调用它,程序将无法编译。我确信这与角色有关,@
因为删除它可以解决问题。
主文本
\documentclass[12pt]{report}
\usepackage[utf8]{inputenc}
\newcommand{\course}[1]{\gdef\mycourse{#1}}%
\newcommand{\anothercommand}[1]{\gdef\myanothercourse{#1}}%
\begin{document}
\course{ee433}
\anothercommand{stats666}
\mycourse{} works and so does \myanothercourse{}.
\end{document}
编辑--------------------------------------------- 如果您将 放在makeatletter
命令正上方的正确位置,它就会解决问题。但是,这会产生一些非常严重的间距问题。在 @PhelypeOleinik 的帮助下,这个新解决方案效果最好。这是一个非常优雅的修改,可以保持变量名称的干净整洁。main.tex
\documentclass[12pt]{report}
\usepackage[utf8]{inputenc}
\makeatletter
\newcommand{\coursename}[1]{\gdef\mycourses@coursename{#1}}%
\newcommand{\coursetime}[1]{\gdef\mycourses@coursetime{#1}}%
\newcommand{\getcoursevalue}[1]{%
\@ifundefined{mycourses@#1}%
{\PackageError{mycourses}{Variable '#1' undefined.}{}}%
{\csname mycourses@#1\endcsname}}
\makeatother
\begin{document}
\coursename{stats666}
\coursetime{6:00 AM, Saturday and Sunday}
\getcoursevalue{coursename} works.
\getcoursevalue{coursetime} works too.
\getcoursevalue{undefined} does not work.
\end{document}