Guest User

Untitled

a guest
May 20th, 2018
142
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
text 4.34 KB | None | 0 0
  1. DeclareDocumentCommand{myMacro} {o o}
  2. {
  3. DeclareDocumentCommand{foo} {} {#1}
  4. DeclareDocumentCommand{bar} {} {#2}
  5. The foo argument was foo and the bar argument was bar
  6.  
  7. }
  8.  
  9. documentclass{article}
  10. usepackage{keyval,xparse}% http://ctan.org/pkg/{keyval,xparse}
  11.  
  12. makeatletter
  13. % ========= KEY DEFINITIONS =========
  14. define@key{mymacro}{first}{defmm@first{#1}}
  15. define@key{mymacro}{second}{defmm@second{#1}}
  16. define@key{mymacro}{third}{defmm@third{#1}}
  17. define@key{mymacro}{last}{defmm@last{#1}}
  18. DeclareDocumentCommand{myMacro}{m}{%
  19. begingroup%
  20. % ========= KEY DEFAULTS + new ones =========
  21. setkeys{mymacro}{first={FIRST arg},second={SECOND arg},third={THIRD arg},last={LAST arg},#1}%
  22. First arg: mm@first par
  23. Second arg: mm@second par
  24. Third arg: mm@third par
  25. Last arg: mm@last
  26. endgroup%
  27. }
  28. makeatother
  29.  
  30. begin{document}
  31.  
  32. myMacro{last=LaSt,first=FiRsT} par hrulefill
  33.  
  34. myMacro{} par hrulefill
  35.  
  36. myMacro{third={$x^2$ textbf{stuff}},second={}}
  37. end{document}
  38.  
  39. documentclass{article}
  40. usepackage{keyval,xparse,url}% http://ctan.org/pkg/{keyval,xparse,url}
  41.  
  42. makeatletter
  43. % ========= KEY DEFINITIONS =========
  44. define@key{movie}{title}{expandafterdefcsname movietag @titleendcsname{#1}}
  45. define@key{movie}{releaseyear}{expandafterdefcsname movietag @releaseyearendcsname{#1}}
  46. define@key{movie}{genre}{expandafterdefcsname movietag @genreendcsname{#1}}
  47. define@key{movie}{url}{expandafterdefcsname movietag @urlendcsname{#1}}
  48. DeclareDocumentCommand{newMovie}{m m}{%
  49. % ========= KEY DEFAULTS + new ones =========
  50. defmovietag{#1}% Store movie tag (used when setting/storing keys)
  51. setkeys{movie}{title={},releaseyear={},genre={},url={},#2}% Create keys
  52. }
  53. DeclareDocumentCommand{showMovie}{m}{%
  54. textbf{csname #1@titleendcsname} (csname #1@releaseyearendcsname),
  55. textit{csname #1@genreendcsname},
  56. expandafterexpandafterexpandafterurlexpandafterexpandafterexpandafter{csname #1@urlendcsname}.
  57. }
  58. makeatother
  59.  
  60. begin{document}
  61.  
  62. % Movie declarations
  63. newMovie{anchorman2}{
  64. url={http://www.imdb.com/title/tt1229340/},
  65. releaseyear=2013,
  66. title={Anchorman: The Legend Continues},
  67. genre=Comedy}
  68. newMovie{lego}{
  69. title={The Lego Movie},
  70. releaseyear=2014,
  71. url={http://www.imdb.com/title/tt1490017/},
  72. genre={Animation, Action, Comedy}}
  73. newMovie{magic}{
  74. title={Now You See Me},
  75. url={http://www.imdb.com/title/tt1670345/},
  76. releaseyear=2013,
  77. genre={Crime, Thriller}}
  78.  
  79. % Show movie details
  80. showMovie{magic}
  81.  
  82. showMovie{anchorman2}
  83.  
  84. showMovie{lego}
  85.  
  86. end{document}
  87.  
  88. documentclass{article}
  89. usepackage{xparse,url}
  90.  
  91. ExplSyntaxOn
  92. % keys
  93. keys_define:nn { oxinabox/movies }
  94. {
  95. title .tl_set:N = l_oxinabox_title_tl,
  96. releaseyear .tl_set:N = l_oxinabox_releaseyear_tl,
  97. genre .tl_set:N = l_oxinabox_genre_tl,
  98. url .tl_set:N = l_oxinabox_url_tl,
  99. }
  100.  
  101. % user level commands
  102. NewDocumentCommand{newMovie}{m m}
  103. {
  104. oxinabox_newmovie:nn { #1 } { #2 }
  105. }
  106.  
  107. NewDocumentCommand{showMovie}{m}
  108. {
  109. oxinabox_showmovie:n { #1 }
  110. }
  111.  
  112. % internal functions
  113. cs_new_protected:Npn oxinabox_newmovie:nn #1 #2
  114. {
  115. group_begin: % keep the assignment to the keys local
  116. prop_new:c { g_oxinabox_movie_#1_prop }
  117. keys_set:nn { oxinabox/movies } { #2 }
  118. prop_gput:cnV { g_oxinabox_movie_#1_prop } { title } l_oxinabox_title_tl
  119. prop_gput:cnV { g_oxinabox_movie_#1_prop } { releaseyear } l_oxinabox_releaseyear_tl
  120. prop_gput:cnV { g_oxinabox_movie_#1_prop } { genre } l_oxinabox_genre_tl
  121. prop_gput:cnV { g_oxinabox_movie_#1_prop } { url } l_oxinabox_url_tl
  122. group_end:
  123. }
  124.  
  125. cs_new:Npn oxinabox_getvalue:nn #1 #2
  126. {
  127. prop_item:cn { g_oxinabox_movie_#1_prop } { #2 }
  128. }
  129. cs_new_protected:Npn oxinabox_showmovie:n #1
  130. {
  131. parnoindent
  132. textbf{ oxinabox_getvalue:nn { #1 } { title } }, ~ %
  133. textbf{ oxinabox_getvalue:nn { #1 } { releaseyear } }, ~ %
  134. textbf{ oxinabox_getvalue:nn { #1 } { genre } },
  135. \
  136. use:x { exp_not:N url { oxinabox_getvalue:nn { #1 } { url } } }
  137. }
  138. ExplSyntaxOff
  139. begin{document}
  140.  
  141. % Movie declarations
  142. newMovie{anchorman2}{
  143. url={http://www.imdb.com/title/tt1229340/},
  144. releaseyear=2013,
  145. title={Anchorman: The Legend Continues},
  146. genre=Comedy}
  147. newMovie{lego}{
  148. title={The Lego Movie},
  149. releaseyear=2014,
  150. url={http://www.imdb.com/title/tt1490017/},
  151. genre={Animation, Action, Comedy}}
  152. newMovie{magic}{
  153. title={Now You See Me},
  154. url={http://www.imdb.com/title/tt1670345/},
  155. releaseyear=2013,
  156. genre={Crime, Thriller}}
  157.  
  158. % Show movie details
  159. showMovie{magic}
  160.  
  161. showMovie{anchorman2}
  162.  
  163. showMovie{lego}
  164.  
  165. end{document}
Add Comment
Please, Sign In to add comment