我的任务是创建一个 LaTeX 模板,用于为学生的研究提案生成评分报告。我们需要一种简单的方法来为提案的特定质量(例如文献综述)分配分数(数值),并设置评论部分。对于 LaTeX 初学者来说,一切都必须非常容易使用。出于某种原因,必须包含一个表示每个分配分数的滑动条。
我遇到的困难是创建一个保存分数的变量。这些分数必须 1) 相加得到最终分数,2) 用于可视滑块。
我尝试过计数器(如我的 MWE 所示),但计数器使用整数,而滑块需要浮点数。此外,滑块需要显示相对分数,一些质量可能占 5%,一些占 10%,等等,因此必须在 LaTeX 中执行一些计算。
总之,我如何保存可以满足这些要求的数值?1)允许求和2)允许计算并在另一个宏中使用。
我试图以 StackExchange 的精神来表达这个问题。如果我有错误,请原谅我;我的目的不是浪费你的时间。
\documentclass[a4paper]{paper}
\usepackage{graphicx}
\usepackage{xcolor}
\usepackage{calc}
\usepackage{tikz}
\usetikzlibrary{calc,shadows,shadows.blur}
\def\IosSevenSlider#1#2{
\tikz[baseline=-0.1cm]{
\coordinate (start) at (0,0);
\coordinate (end) at (#1,0);
\coordinate (mark) at ($(start)!#2!(end)$);
\useasboundingbox (start|- 0,-.25) rectangle (end|- 0, .25);
\draw[line width=0.4mm, line cap=round, blue!50!cyan]
(start) -- (mark) edge[lightgray] (end);
\node[fill=white, draw=lightgray, very thin,
blur shadow={shadow xshift=0pt, shadow opacity=20, shadow yshift=-0.9mm,
shadow blur steps=6, shadow blur radius=0.3mm},
circle, minimum size=0.25cm, inner sep=0pt] at (mark) {};
}
}
% SETS UPS MARK VARIABLES, Q1 = Question 1 etc)
\newcounter{q1} % Counts for 10%
\newcounter{q2} % Counts for 5%
% THIS IS WHERE YOU WILL ENTER YOUR MARKS PER QUESTION
\setcounter{q1}{5}
\setcounter{q2}{3}
\begin{document}
\begin{table}
\centering
\begin{tabular}{ll}
% Using the value for q1 results in the slider overshooting!
Overall Presentation (Structure and English) & \setlength{\fboxsep}{0pt} \fbox{\IosSevenSlider{5cm}{\value{q1}}} \\
% A hardcoded value works just fine.
Clarity of title (Accurate and concise) & \setlength{\fboxsep}{0pt} \fbox{\IosSevenSlider{5cm}{.5}} \\
\end{tabular}
\end{table}
\end {document}
答案1
使用普通的乳胶计数器来记录总数是没有问题的。只需用来\addtocounter
加总分数,然后在最后打印总数即可。
您的滑块存在两个问题:
- 首先,
tikz
需要数字坐标,但您的宏要求它转换(5cm,0)
成坐标:只需使用(5,0)
。 - 其次,您尝试使用 来定位滑块
(start)!#2!(end)
,因此#2
必须介于 0 和 1 之间,但您给它满分。您需要5/10
,而不是5
。这就是您出现溢出的原因。 - 我怀疑您可能不希望滑块的宽度作为参数
\IosSevenSlider
,而是希望问题的最大标记作为参数。
最后,由于您希望让非 LaTeX 用户也能轻松使用此模板,我建议您将宏的核心部分放入单独的类文件中,然后只需调用环境即可创建表。破解您的代码,以下是我对类文件的建议:
\LoadClass[a4paper]{paper}
\usepackage{graphicx}
\usepackage{xcolor}
\usepackage{calc}
\usepackage{tikz}
\usetikzlibrary{calc,shadows,shadows.blur}
\setlength{\fboxsep}{0pt}
% IsoSevenSlider[slider length]{mark}{maximum mark}
\newcommand\IosSevenSlider[3][4]{\fbox{%
\tikz[baseline=-0.1cm]{
\coordinate (start) at (0,0);
\coordinate (end) at (#1,0);
\coordinate (mark) at ($ (start)! {#2/#3} !(end) $);
\useasboundingbox (start|- 0,-.25) rectangle (end|- 0, .25);
\draw[line width=0.4mm, line cap=round, blue!50!cyan]
(start) -- (mark) edge[lightgray] (end);
\node[fill=white, draw=lightgray, very thin,
blur shadow={shadow xshift=0pt, shadow opacity=20, shadow yshift=-0.9mm,
shadow blur steps=6, shadow blur radius=0.3mm},
circle, minimum size=0.25cm, inner sep=0pt] at (mark) {};
}}}
% Counters to keep track of students' marks and the maximum possible mark
\newcounter{TotalMarks}
\newcounter{MaximumMarks}
% \Mark{mark} or \Mark[maximum (default=5)]{mark}
\newcommand\Mark[2][5]{#2&\IosSevenSlider{#2}{#1}%
\addtocounter{TotalMarks}{#2}\addtocounter{MaximumMarks}{#1}}
\newenvironment{Marks}%
{\document\center\tabular{lll}}%
{\textbf{Total marks} & \theTotalMarks &\IosSevenSlider{\theTotalMarks}{\theMaximumMarks}\\%
\endtabular\endcenter\enddocument}
\endinput
如果调用这个函数marks.cls
那么你的模板文件将会像这样:
\documentclass{marks}
\begin{Marks}
% Using the value for q1 results in the slider overshooting!
Overall Presentation (Structure and English) & \Mark{5}\\
% A hardcoded value works just fine.
Clarity of title (Accurate and concise) & \Mark{3} \\
\end{Marks}
得出的结果为:
在执行此操作时,我对你的宏进行了一些修改。
- 现在
\IsoSevenSlider
需要三个参数:#1
=滑块宽度(可选)、#2=标记和#3=最大可能标记。可能#1
可以删除。我只是破解了您的tikz
代码以使其工作;特别是,我没有尝试改进或修改它:)此宏不会直接在模板中调用。默认情况下#1
=4 - 选择此值只是为了使滑块适合页边距。 - 环境
Marks
会启动和关闭文档并绘制表格。最后会添加一条总分线以及滑块。 - 该
\Mark
宏会打印学生的分数并将其添加到累计总分中。该宏有一个可选参数,指定问题的最高分数(默认为 5)。请注意,环境创建的表格环境Marks
现在有三列,并\Mark
在最后两列中创建条目。
请注意,我没有为单个问号定义计数器。相反,我\Mark
会打印分数并将其添加到累计总数中(它会跟踪可能的最高分数)。除非您以后想要使用单个分数,否则您无需记住它们(如果您以后确实需要这些分数,那么修改它\Mark
以使其也能记住它们并不困难)。
编辑
我认为,您可以通过将&
和\\
移入\Mark
宏并将其定义更改为:来进一步简化 LaTeX,以适应新手用户:
\newcommand\Mark[2][5]{&\IosSevenSlider{#2}{#1}\\%
\addtocounter{TotalMarks}{#2}\addtocounter{MaximumMarks}{#1}}
经过此更改,你的模板文件将变为:
\documentclass{marks}
\begin{Marks}
Overall Presentation (Structure and English) \Mark{5}
Clarity of title (Accurate and concise) \Mark{3}
\end{Marks}