创建变量表

创建变量表

我正在尝试根据我想要的句子创建一个变量表。有时我需要所有句子,有时则不需要。这是我目前得到的。

\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定义了作为第一个参数给出的新宏,因此它打印所述标题(第二个参数)并在编号的段落中进行选择。实际上,您可以选择任意字符串来标记段落,而不是12等等。

注意,由于您用法语书写,因此最好在之后设置文本\begin{document},这样您就不需要调整标点符号。

我还删除了tabularx不需要的,因为第一列的宽度已知。不要同时加载xcolorcolortbl,而是将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}

我会避免设置\arraystretch2.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。除了修复代码问题之外,这还提供了更好的语法,因为它允许您使用更有意义的缩写,例如FaireExpl等等,而不是意义不大的数字1,,2...。

其次,除非您还想在表格之外使用这些命令,否则无需使用单独的命令\communiquercompetences环境:您只需将它们组合成一个命令即可。有了这个,下面的代码将使用以下命令创建其表格:

   \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}

显然,\IfSubStrs(代表 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

这解决了你的问题。

相关内容