我正在尝试根据我想要的句子创建一个变量表。有时我需要所有句子,有时则不需要。这是我目前得到的。
\documentclass[11pt,a4paper]{article}
\usepackage[dvipsnames]{xcolor}
\usepackage{xstring}
\usepackage{tabularx}
\usepackage{colortbl}
\renewcommand{\arraystretch}{2.5}
\newenvironment{competences}{
\tabularx{\linewidth}{|m{1cm}|>{\raggedright\arraybackslash}X|}
\hline
}{
\endtabularx
}
\newcommand{\communiquer}[1]{
\multicolumn{2}{|l|}{\cellcolor{violet!25} \textbf{Communiquer}}\\\hline
\IfSubStr{#1}{1}{ & Faire le lien entre le langage naturel et le langage algébrique. Distinguer des spécificités du langage mathématique par rapport à la langue française.\\\hline}{}
\IfSubStr{#1}{2}{& Expliquer à l'oral ou à l'écrit (sa démarche, son raisonnement, un calcul, un protocole de construction géométrique, un algorithme), comprendre les explications d'un autre et argumenter dans l'échange.\\\hline}{}
\IfSubStr{#1}{3}{& Vérifier la validité d'une information et distinguer ce qui est objectif et ce qui est subjectif ; lire, interpréter, commenter, produire des tableaux, des graphiques, des diagrammes. \\\hline}{}
}
\begin{document}
\begin{competences}
\communiquer{2}
\end{competences}
\end{document}
当我使用命令时,它工作得很好\communiquer{1,2,3}
,但是当我使用\communiquer{2}
例如时,我的表格底部有两个额外的垂直规则。我不明白为什么!
答案1
您可能还有其他宏需要定义\communiquer
,因此最好为它们定义一个接口。
这里\maketablemacro
定义了作为第一个参数给出的新宏,因此它打印所述标题(第二个参数)并在编号的段落中进行选择。实际上,您可以选择任意字符串来标记段落,而不是1
,2
等等。
注意,由于您用法语书写,因此最好在之后设置文本\begin{document}
,这样您就不需要调整标点符号。
我还删除了tabularx
不需要的,因为第一列的宽度已知。不要同时加载xcolor
和colortbl
,而是将table
选项传递给前者。
\documentclass[11pt,a4paper]{article}
\usepackage[T1]{fontenc}
\usepackage[french]{babel}
\usepackage[dvipsnames,table]{xcolor}
\usepackage{array}
\usepackage{xparse}
\ExplSyntaxOn
\NewDocumentEnvironment{competences}{}
{
\noindent
\begin{tabular}
{
|m{1cm}|
>{\raggedright\arraybackslash}
m{ \dim_eval:n { \textwidth-4\tabcolsep-3\arrayrulewidth-1cm } }
|
}
\hline
}
{
\end{tabular}
}
\NewDocumentCommand{\maketablemacro}{mmm}
{% #1 is the macro to define
% #2 is the title
% #3 is the contents, in the form {1}{text1}{2}{text2}...
\yohann_table_make_macro:Nnn #1 { #2 } { #3 }
}
\tl_new:N \l__yohann_table_body_tl
\cs_new_protected:Nn \yohann_table_make_macro:Nnn
{
\cs_new:Npn #1 ##1
{
\multicolumn{2}{|l|}{\cellcolor{violet!25}\textbf{#2}} \\ \hline
\tl_clear:N \l__yohann_table_body_tl
\clist_map_inline:nn { ##1 }
{
\tl_put_right:Nn \l__yohann_table_body_tl
{
& \str_case:nnT { ####1 } { #3 } \tabularnewline \hline
}
}
\tl_use:N \l__yohann_table_body_tl
}
}
\ExplSyntaxOff
\begin{document}
\maketablemacro{\communiquer}{Communiquer}{
{1}{Faire le lien entre le langage naturel et le langage algébrique.
Distinguer des spécificités du langage mathématique par rapport
à la langue française.}
{2}{Expliquer à l'oral ou à l'écrit (sa démarche, son raisonnement,
un calcul, un protocole de construction géométrique, un algorithme),
comprendre les explications d'un autre et argumenter dans l'échange.}
{3}{Vérifier la validité d'une information et distinguer ce qui est
objectif et ce qui est subjectif ; lire, interpréter, commenter,
produire des tableaux, des graphiques, des diagrammes.}
}
\begin{competences}
\communiquer{2}
\end{competences}
\bigskip
\begin{competences}
\communiquer{2,1,3}
\end{competences}
\end{document}
我会避免设置\arraystretch
为2.5
。
该宏也可以定义为
\maketablemacro{\communiquer}{Communiquer}{
{Faire}{Faire le lien entre le langage naturel et le langage algébrique.
Distinguer des spécificités du langage mathématique par rapport
à la langue française.}
{Expliquer}{Expliquer à l'oral ou à l'écrit (sa démarche, son raisonnement,
un calcul, un protocole de construction géométrique, un algorithme),
comprendre les explications d'un autre et argumenter dans l'échange.}
{Vérifier}{Vérifier la validité d'une information et distinguer ce qui est
objectif et ce qui est subjectif ; lire, interpréter, commenter,
produire des tableaux, des graphiques, des diagrammes.}
}
并调用宏如下
\communiquer{Expliquer,Faire,Vérifier}
会导致同样的结果。
答案2
我建议不要\IfSubStr
使用来自LaTeX3。除了修复代码问题之外,这还提供了更好的语法,因为它允许您使用更有意义的缩写,例如Faire
,Expl
等等,而不是意义不大的数字1
,,2
...。
其次,除非您还想在表格之外使用这些命令,否则无需使用单独的命令\communiquer
和competences
环境:您只需将它们组合成一个命令即可。有了这个,下面的代码将使用以下命令创建其表格:
\Competences{Faire}
\Competences{Expl}
\Competences{Faire,Ver,Expl}
下面的代码定义了两个(用户)命令:
\AddCompetence
用于添加或定义能力。这用作\AddCompetence{key}{description}
\Competences
用于编写能力表。它接受以逗号分隔的键列表。
MWE 的输出是:
以下是代码:
\documentclass[11pt,a4paper]{article}
\usepackage[dvipsnames]{xcolor}
\usepackage{expl3}
\usepackage{tabularx}
\usepackage{colortbl}
\ExplSyntaxOn
\prop_new:N \g__sentences_prop
\tl_new:N \l_sentence_tl
% add competence: \AddCompetence{key}{description}
\newcommand\AddCompetence[2]{
\prop_gput:Nnn \g__sentences_prop {#1} {#2}
}
% internal command that writes one line of a competence table
\cs_new_protected:Npn \l__use_sentence:n #1 {
&
\prop_get:NnN \g__sentences_prop {#1} \l_sentence_tl
\tl_use:N \l_sentence_tl
\\\hline
}
% list competences: \Competences{comma separated list of keys}
\newcommand\Competences[1]{
\begin{tabularx}{\linewidth}{|m{1cm}|>{\raggedright\arraybackslash}X|}
\hline
\multicolumn{2}{|l|}{\cellcolor{violet!25} \textbf{Communiquer}}\\\hline
% loop through the list of keys keys and apply \l__use_sentence:n
\clist_set:Nn \l_tmpa_clist {#1}
\clist_map_function:NN \l_tmpa_clist \l__use_sentence:n
\end{tabularx}
}
\ExplSyntaxOff
\AddCompetence{Faire}{Faire le lien entre le langage naturel et le langage algébrique. Distinguer des spécificités du langage mathématique par rapport à la langue française.}
\AddCompetence{Expl}{Expliquer à l'oral ou à l'écrit (sa démarche, son raisonnement, un calcul, un protocole de construction géométrique, un algorithme), comprendre les explications d'un autre et argumenter dans l'échange.}
\AddCompetence{Ver}{Vérifier la validité d'une information et distinguer ce qui est objectif et ce qui est subjectif ; lire, interpréter, commenter, produire des tableaux, des graphiques, des diagrammes}
\begin{document}
\Competences{Faire}
\Competences{Expl}
\Competences{Faire,Ver,Expl}
\end{document}
答案3
我无法详细解释发生了什么,但我发现这一点:
\begin{competences}
\communiquer{1}
\end{competences}
\begin{competences}
\multicolumn{2}{|l|}{\cellcolor{violet!25} \textbf{Communiquer}}\\\hline
& Faire le lien entre le langage naturel et le langage algébrique. Distinguer des spécificités du langage mathématique par rapport à la langue française.\\\hline
{} % This starts a new line
\end{competences}
显然,\IfSubStr
s(代表 2 和 3)不会被忽略,并在 之后开始新行\hline
。
(请注意,任何\communiquer
参数中包含 3 的命令都会给出所需的结果。)
\hline
一个简单的解决方法就是像这样重新调整 s 的位置:
\newcommand{\communiquer}[1]{
\multicolumn{2}{|l|}{\cellcolor{violet!25} \textbf{Communiquer}}
\IfSubStr{#1}{1}
{\\\hline& Faire le lien entre le langage naturel et le langage algébrique. Distinguer des spécificités du langage mathématique par rapport à la langue française.}
{}
\IfSubStr{#1}{2}
{\\\hline & Expliquer à l'oral ou à l'écrit (sa démarche, son raisonnement, un calcul, un protocole de construction géométrique, un algorithme), comprendre les explications d'un autre et argumenter dans l'échange.}
{}
\IfSubStr{#1}{3}
{\\\hline & Vérifier la validité d'une information et distinguer ce qui est objectif et ce qui est subjectif ; lire, interpréter, commenter, produire des tableaux, des graphiques, des diagrammes.}
{}
\\\hline
}
因此,让每个下一个真值都为前一个真值\IfSubStr
设置\\\hline
,并始终以结束\\\hline
。
这解决了你的问题。