\输入{\} 产生“未定义的控制序列”

\输入{\} 产生“未定义的控制序列”

我正在创建一个课程,我想用它来创建自己的工作表。因此,我希望我教授的每门课程都有自己的信息文件,存储在文件中,在作业中,我可以使用诸如 之类的命令来访问该文件\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.clsmain.texstats666.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}

相关内容