![检测投影机的长宽比](https://linux22.com/image/271779/%E6%A3%80%E6%B5%8B%E6%8A%95%E5%BD%B1%E6%9C%BA%E7%9A%84%E9%95%BF%E5%AE%BD%E6%AF%94.png)
我正在用 制作幻灯片beamer
。目前我不确定演示中将使用的纵横比。我知道我可以使用 的类选项更改比例beamer
。
问题是,更改纵横比会改变文档尺寸,因此我必须调整演示文稿中的某些参数(图形高度)。我想为 4:3 和 16:9 比例设计演示文稿。
是否有可能
\ifratio{34}{do somthing}
\ifratio{169}{do ohters}
或者
\ifratio{34}{do this}{else this}
答案1
除页面尺寸外,该aspectratio
选项未设置任何有用的标志。可以检查这些尺寸对,或者直接从选项列表中进行检查;以下是根据expl3
后一种策略借助于定义的两个宏。
\documentclass[aspectratio=1610]{beamer}
\usepackage{xparse}
\ExplSyntaxOn
\NewDocumentCommand{\ifaspectratio}{mmm}
{
% Recover the option from those passed to the class
\keys_set:nf { zunbeltz/beameroptions } { \use:c { [email protected] } }
\str_if_eq:nVTF { #1 } \l_zunbeltz_aspectratio_tl { #2 } { #3 }
}
\NewDocumentCommand{\xifaspectratio}{mO{}}
{
% Recover the option from those passed to the class
\keys_set:nf { zunbeltz/beameroptions } { \use:c { [email protected] } }
\str_case:Vnn \l_zunbeltz_aspectratio_tl { #1 } { #2 }
}
% We need to define only one key, the other are treated as `unknown'
\keys_define:nn { zunbeltz/beameroptions }
{
aspectratio .tl_set:N = \l_zunbeltz_aspectratio_tl,
aspectratio .initial:n = 43,
unknown .code:n = {},
}
% Generate the variants we need
\cs_generate_variant:Nn \keys_set:nn { nf }
\cs_generate_variant:Nn \str_if_eq:nnTF { nV }
\cs_generate_variant:Nn \str_case:nnn { V }
\ExplSyntaxOff
\begin{document}
\begin{frame}
\ifaspectratio{1610}{We're on 16:10}{We're not on 16:10}
\xifaspectratio{
{169}{We're on 16:9}
{43}{We're on 4:3}
}[None of the above]
\end{frame}
\end{document}
该宏\ifaspectratio
接受三个参数:我们要测试的比例、真实文本和虚假文本。
宏\xifaspectratio
更加灵活:它接受一个强制参数,即一串对的列表{<ratio>}{<text>}
和一个“以上都不是”情况的可选参数。
通过添加,\keys_define:nn { zunbeltz/beameroptions }
可以定义类似的宏来检查其他选项。
答案2
您可以ifthen
按照以下方式使用包
\documentclass{beamer}
%\documentclass[aspectratio=169]{beamer}
\usepackage{ifthen}
\makeatletter
\newcommand{\prova}{Aspect ratio is 4:3 (default)}
\ifthenelse{%
\lengthtest{\beamer@paperwidth=16cm}}% condition (16cm is the width of the frame with an aspect ratio = 16:9)
{\renewcommand{\prova}{Aspect ratio is 16:9}}% do this if condition is true
{}% do nothing elsewhere
\makeatother
\begin{document}
\begin{frame}
\prova
\end{frame}
\end{document}
您还可以添加其他类似的结构
\ifthenelse{%
\lengthtest{\beamer@paperwidth=16cm}}% condition (16cm is the width of the frame with an aspect ratio = 16:9)
{\renewcommand{\prova}{Aspect ratio is 16:9}}% do this if condition is true
{}% do nothing elsewhere
添加其他“支持的”宽高比。但是,如果你想要创建更通用的东西(不仅适合你,也不仅仅适合 16:9 或 4:3 宽高比),你必须小心,因为不同的宽高比可以有相同的paperwidth
或相同的paperheight
。一个解决方案是将两个\ifthenelse
一个放在另一个里面。
这是将不同纵横比的纸张尺寸定义到beamer.cls
类文件中的方式
\DeclareOptionBeamer{aspectratio}[43]{%
\ifnum#1=1610%
\beamer@paperwidth 16.00cm%
\beamer@paperheight 10.00cm%
\else\ifnum#1=169%
\beamer@paperwidth 16.00cm%
\beamer@paperheight 9.00cm%
\else\ifnum#1=149%
\beamer@paperwidth 14.00cm%
\beamer@paperheight 9.00cm%
\else\ifnum#1=54%
\beamer@paperwidth 12.50cm%
\beamer@paperheight 10.00cm%
\else\ifnum#1=43%
\beamer@paperwidth 12.80cm%
\beamer@paperheight 9.60cm%
\else\ifnum#1=32%
\beamer@paperwidth 13.50cm%
\beamer@paperheight 9.00cm%
\fi\fi\fi\fi\fi\fi%
}
答案3
我采纳了您的第二个建议,并创建了一个名为的命令,\ifratio
其用法如下:
\ifratio{43}{code in case aspect ratio is 43}{code otherwise}
您可以同时使用纵横比选项;43
但是169
,因为我太懒了,所以不能使用其他选项,但您可以轻松扩展命令以处理更多情况。
不需要ifthenelse
。
%\documentclass{beamer}
\documentclass[aspectratio=169]{beamer}
\makeatletter
\newcommand\ifratio[3]{%
\ifnum#1=169%
\ifdim\beamer@paperwidth=16.00cm\relax%
\ifdim\beamer@paperheight=9.00cm\relax%
#2%
\else%
#3%
\fi%
\else%
#3%
\fi%
\else%
\ifnum#1=43%
\ifdim\beamer@paperwidth=12.80cm\relax%
\ifdim\beamer@paperheight=9.60cm\relax%
#2%
\else%
#3%
\fi%
\else%
#3%
\fi%
\fi%
\fi%
}
\makeatother
\begin{document}
\begin{frame}
\ifratio{169}{Code for 169}{Code for aspect ratio other than 169}
\end{frame}
\end{document
答案4
随着当前 beamer 开发版本(应该包含在 beamer v3.70 或更新版本中),您可以使用\insertaspectratio
宏来访问演示的纵横比:
\documentclass[
aspectratio=169
% aspectratio=43
]{beamer}
\begin{document}
\begin{frame}
\ifnum\insertaspectratio=169
do something
\else
something else
\fi
\end{frame}
\end{document}