在法国,学生们被教导不要重复两遍相同的文字,因为同一行文字和下一行文字之间差别不大。这是一种快速记笔记的方法。
我通过修改重现了这种效果:
代码如下:
\documentclass[aspectratio=1610]{beamer}
\usepackage[T1]{fontenc}
\usepackage[french]{babel}
\usepackage{amsmath, amsfonts, amssymb}
\usefonttheme[onlymath]{serif}
\begin{document}
\begin{frame}
Lorsque le \og \textit{carreau carré} \fg{} mesure:
\begin{itemize}
\item $\rm 1\,cm$ de côté, l'unité d'aire est appelée le \og \textrm{centimètre carré} \fg{} et est noté $\rm cm^2$;
\item $\rm 1\,dm$ \hspace{1mm}'' \hspace{3mm}'' \hspace{8mm}'' \hspace{8mm}'' \hspace{5mm}''\hspace{8mm}'' \hspace{5.5mm}''\hspace{1mm} \og \textrm{décimètre carré} \fg{} \hspace{2mm}'' \hspace{2mm}'' \hspace{4mm}'' \hspace{1.5mm} $\rm dm^2$;
\item $\rm 1\,m$ \hspace{3mm}'' \hspace{3mm}'' \hspace{8mm}'' \hspace{8mm}'' \hspace{5mm}'' \hspace{7mm}'' \hspace{5.5mm}''\hspace{1mm} \og \textrm{mètre carré} \fg{} \hspace{9mm}'' \hspace{2mm}'' \hspace{4mm}'' \hspace{1mm} $\rm m^2$;
\item etc.
\end{itemize}
\end{frame}
\end{document}
我怎样才能比刚才修修补补更简单地获得同样的效果?
答案1
由于@samcarter 比我快,所以我不得不在我的答案中构建一些特殊功能,借用@egreg 的一些代码(关联):
\documentclass[aspectratio=1610]{beamer}
\usepackage[french]{babel}
\usepackage[T1]{fontenc}
\usepackage{amsmath, amsfonts, amssymb}
\usefonttheme[onlymath]{serif}
% from egreg's answer at
%https://tex.stackexchange.com/a/280981/97512
\usepackage{xparse}
\ExplSyntaxOn
\NewDocumentCommand{\xsameword}{m}
{
\leavevmode\maieul_xsameword:n { #1 }
}
\tl_new:N \l__maieul_xsameword_list_tl
\cs_new_protected:Nn \maieul_xsameword:n
{
\tl_set:Nn \l__maieul_xsameword_list_tl
{
\__maieul_xsameword_start:n { #1 }
}
\regex_replace_all:nnN
{ (\c{footnote}\cB..*?\cE.) }
{ \cE\} \1 \c{__maieul_xsameword_start:n} \cB\{ }
\l__maieul_xsameword_list_tl
\tl_use:N \l__maieul_xsameword_list_tl
}
\cs_new_protected:Nn \__maieul_xsameword_start:n
{
\tl_set:Nn \l__maieul_xsameword_list_tl { #1 }
\regex_replace_all:nnN
{ ([^\s,.!?]+) }% Delete what should not be printed again here
{ \c{maieul_xsameword_format:n} \cB\{ \1 \cE\} }
\l__maieul_xsameword_list_tl
\tl_use:N \l__maieul_xsameword_list_tl
}
\NewDocumentCommand{\setxsamewordformat}{m}
{
\cs_set_protected:Nn \maieul_xsameword_format:n { #1 }
}
\ExplSyntaxOff
%%%%%%%%%%%%%%%%%%%%%
\newbox\mytmpbox
\newcommand{\repword}[1]{%
\sbox{\mytmpbox}{#1}%
\hbox to \wd\mytmpbox{\hss\hspace{.2em}''\hss}%
}
\setxsamewordformat{\repword{#1}}
\newcommand{\keepword}[2]{%
\sbox{\mytmpbox}{#2}%
\hbox to \wd\mytmpbox{\hss#1\hss}%
}
\begin{document}
\begin{frame}
Lorsque le \og \textit{carreau carré} \fg{} mesure:
\begin{itemize}
\item {1}\,$cm$ de côté, l'unité d'aire est appelée le \og \textit{\textrm{centimètre carré}} \fg{} et est noté $cm^2$;
\item 1\,\keepword{$dm$}{$cm$} \xsameword{de côté, l'unité d'aire est appelée le} \keepword{\og \textit{\textrm{décimètre carré}} \fg{}}{\og \textit{\textrm{centimètre carré}} \fg{}} \xsameword{et est noté} $cm^2$;
\item 1\,\keepword{$m$}{$cm$} \xsameword{de côté, l'unité d'aire est appelée le} \keepword{\og \textit{\textrm{mètre carré}} \fg{}}{\og \textit{\textrm{centimètre carré}} \fg{}} \xsameword{et est noté} \keepword{$m^2$}{$cm^2$};
\end{itemize}
\end{frame}
\end{document}
这样,您就可以将整个句子放入 的参数中\xsamewords
,它们将被替换。此外,我还创建了一个宏,允许您插入占用与另一个单词相同空间的单词:\keepwords{this line}{line above}
。
编辑:现在我把第一个放进$dm$
去\keepwords
并且它已经正确对齐了,感谢@marmot 指引我!:-)
编辑2:添加了三行的示例。
编辑3:添加\usepackage[T1]{fontenc}
并插入一条注释,显示应编辑哪一行以删除逗号等。
这条线{ ([^\s,.!?]+) }
代表regular expression
或短。如果简单或不够,regex
它们可用于高级模式匹配。此处,此正则表达式表示应由您的重复标记替换的单词:find
find & replace
''
[..]
括号匹配里面的一个字符。[abc]
操作foobar
将匹配b
或a
(但只能匹配其中一个,即单身的特点)。[^..]
是里面字符的否定,所以这个正则表达式匹配任何东西不是present.[^abc]
操作foobar
将匹配f
、o
、o
或r
。\s
是任何空白字符(空格、制表符,有时也是换行符),.!?
我认为是不言自明的;)+
字符后面的 (记住,括号匹配单个字符)使该字符匹配尽可能多的多个(“相同”)字符(通常行为),但至少匹配一个。因此,例如,o+
在正则表达式中,对字符串进行操作fooobar
将匹配ooo
,而不仅仅是一个或两个o
s。[abc]+
对字符串进行操作foobar
将匹配ba
。
你现在可以看到,这个正则表达式匹配了所有内容不是空格或标点符号,即所有其他内容,即包含所有其他特殊字符的单词。您可以将否定括号内的符号视为您仍想打印但不想在此上下文中替换的单词分隔符。
编辑4:\leavevmode
如果在调用(旧)之前添加\xsameword
,它在行首也应该可以正常工作。现在,我在 的定义中添加了它\xsameword
,因此无需手动处理它。
答案2
您不需要猜测所需的空格,而是可以测量要替换的单词的宽度:
\documentclass[aspectratio=1610]{beamer}
\usepackage[french]{babel}
\usepackage{amsmath, amsfonts, amssymb}
\usefonttheme[onlymath]{serif}
\usepackage{siunitx}
\newlength{\mywidth}
\newcommand{\test}[1]{%
\settowidth{\mywidth}{#1}%
\makebox[\mywidth][c]{''}%
}
\newlength{\centwidth}
\settowidth{\centwidth}{<< centimètre carré >>}
\newlength{\foowidth}
\settowidth{\foowidth}{\SI{1}{\centi\meter}}
\begin{document}
\begin{frame}
Lorsque le \og \textit{carreau carré} \fg{} mesure:
\begin{itemize}
\item \makebox[\foowidth][l]{\SI{1}{\centi\meter}} de côté, l'unité d'aire est appelée le \makebox[\centwidth][c]{\og \textit{\textrm{centimètre carré}} \fg} et est noté \si{\centi\meter\square};
\item \makebox[\foowidth][l]{\SI{1}{\deci\meter}} \test{de} \test{côté,} \test{l'unité} \test{d'aire} \test{est} \test{appelée} \test{le} \makebox[\centwidth][c]{\og \textit{\textrm{décimètre carré}} \fg} \test{et} \test{est} \test{noté} \si{\deci\meter\square};
\item \makebox[\foowidth][l]{\SI{1}{\meter}} \test{de} \test{côté,} \test{l'unité} \test{d'aire} \test{est} \test{appelée} \test{le} \makebox[\centwidth][c]{\og \textit{\textrm{mètre carré}} \fg} \test{et} \test{est} \test{noté} \si{\meter\square};
\end{itemize}
\end{frame}
\end{document}
另一种方法是使用表格
\documentclass[aspectratio=1610]{beamer}
\usepackage[french]{babel}
\usepackage{amsmath, amsfonts, amssymb}
\usefonttheme[onlymath]{serif}
\usepackage{siunitx}
\begin{document}
\begin{frame}
Lorsque le \og \textit{carreau carré} \fg{} mesure:
\begin{tabular}{ll*{11}{@{~}c}@{~}l}
\usebeamertemplate{itemize item} & \SI{1}{\centi\meter} & de & côté,& l'unité &d'aire &est& appelée& le &\og \textit{\textrm{centimètre carré}} \fg{}& et &est& noté& \si{\centi\meter\square};\\
\usebeamertemplate{itemize item} & \SI{1}{\deci\meter} & " & " & " & " & " & " & " &\og \textit{\textrm{décimètre carré}} \fg{}& " & " & " & \si{\deci\meter\square};\\
\usebeamertemplate{itemize item} & \SI{1}{\meter} & " & " & " & " & " & " & " &\og \textit{\textrm{mètre carré}} \fg{}& " & " & " & \si{\meter\square};\\
\end{tabular}
\end{frame}
\end{document}