建立一个系统来在每个段落中交替使用性别

建立一个系统来在每个段落中交替使用性别

角色扮演写作已经成为交换的传统按段落进行。例如“他在第一级时每天可以使用一次打击邪恶的能力。(等等等等,段落中断)当圣骑士达到 4 级时,她可以每天使用该能力三次。”

现在,这并不难写,但段落经常被移动等。有没有办法让我在文本中输入\hir\sie,然后让 LaTeX 找出段落的顺序,并将它们交换成,每段交替出现男性和女性?

答案1

he-she软件包现在可以满足您的所有需求。(由于这个问题,我添加了一个软件包选项。)让我们首先看看如何在没有自动化的情况下做到这一点(以及为什么这可能是更好的选择。)

部分自动化

he-she包为代词实现了两组不同的宏:一组(\heshe\himher\hisher)输出代词,并在下次使用同一组中的任何一个时切换性别。例如:

\Heshe put  \hisher coat beside a statue of \himher.

将输出

他把她的外套放在他的雕像旁边。

或者:

她把他的外套放在她的雕像旁边。

取决于当前状态。

然而,第二组代词(\he,,\him\his允许你继续当前性别状态可以随意更改,就你的情况而言,可以改成一整段。因此,在这种情况下:

\Heshe put  \his coat beside a statue of \him.

将输出

他把外套放在自己的雕像旁边。

或者:

她把外套放在自己的雕像旁边。

取决于当前状态。

因此,如果你想在每段中更改代词,你可以这样做第一的段落中代词的实例是切换版本,而每个后续代词都是非切换(重复)版本。

现在,这显然不会自动切换每个段落,但我不确定这是否可取。正如句子不是改变性别的正确级别一样,我也不清楚段落是否是改变性别的正确级别,因为你可能真的想在某种更高的结构级别上进行更改(例如“主题更改”)。因此,重置每个段落的性别可能不是最好的主意,而是重置每组形成连贯主题的一个或多个段落的性别。

然而,如果你执着于自动化(毕竟这是我们都喜欢 LaTeX 的原因之一),那么可以这样做:

完全自动化

将解决方案适配everyparhe-she包中,我们可以执行以下操作。我已使用该everyhook包与进行交互\everypar。现在已将其作为选项添加到包本身。

\documentclass{article}
\usepackage{everyhook}
\usepackage{he-she}
\PushPreHook{par}{\makebox[0pt][0pt]{\heshe}}
\begin{document}
When a player rolls the dice \he will have to do something. \He will do that thing
with all of \his powers and \he will make sure that nobody sees \him.

When a player rolls the dice \he will have to do something. \He will do that thing
with all of \his powers and \he will make sure that nobody sees \him.

\end{document}

这里的想法是,我们\par在零宽度框中挂接并发出代词命令的切换版本。然后我们在运行文本中使用代词的照应版本。

作为套餐选项

这已作为选项实现到包中[para]。因此,使用当前版本的包 (v1.1),您只需执行以下操作:

\documentclass{article}
\usepackage[para]{he-she}

\begin{document}
When a player rolls the dice \he will have to do something. \He will do that thing
with all of \his powers and \he will make sure that nobody sees \him.

When a player rolls the dice \he will have to do something. \He will do that thing
with all of \his powers and \he will make sure that nobody sees \him.

\end{document}

代码输出

答案2

编辑
如果您需要的功能是确切地如上所述,然后Alan Munn 的回答无疑是更好的解决方案,而且远不如我自己的解决方案有趣。但是,下面的答案展示了一种基本方法,在许多其他情况下可能有用。


创建一个新的 if 并将切换器挂接到\everypar,您就可以做到这一点。(钩子必须在里面,document因为document显然重新定义了它。)

但请注意,这lipsum似乎不符合正常规则(事实上它可能\everypar再次重新定义)。

新输出

\documentclass{article}

\newif\ifgendermale
\newcommand{\switchHeShe}{%
  \ifgendermale%
  \gendermalefalse%
  \else%
  \gendermaletrue%
  \fi}

\newcommand{\hir}{\ifgendermale his\else her\fi}
\newcommand{\sie}{\ifgendermale he\else she\fi}

\usepackage{lipsum}

\gendermaletrue
\begin{document}
\everypar=\expandafter{\the\everypar\switchHeShe}

Nobody knows \hir{} name.  Nobody knows the size of \hir{} naval.

In this game, the player will try to determine the naval size and name
of the antagonist.  In doing so, \sie{} will probably have fun.

If \sie{} doesn't though, just hit \hir{} over the head with a naval.

As you can see, this works for the main body of text.  The minute you
introduce environments, notice,
\begin{itemize}
\item \sie{} doesn't do capitalization.
\item \hir{} nose may be offended.
\item \verb+\everypar+ gets reset all the time.
\item By valiant diligence\dots and stuff\dots \sie{} can 
\begin{itemize}
\everypar=\expandafter{\the\everypar\switchHeShe}
\item see \hir{} own nose
\item know \hir{} own destiny
\item complain about built-in environments \textit{completely}
  resetting the hook.
\end{itemize}
\end{itemize}
\end{document}

答案3

只要避免使用代词即可。这样听起来也更好。

“在第一级时,他每天可以使用一次惩恶能力。(等等等等,段落中断)当圣骑士达到第四级时,她可以每天使用该能力三次。”

“在第一级时,惩恶能力每天可使用一次。(等等)当圣骑士达到四级时,该能力每天可使用三次。”

相关内容