+ translator_group_type_), ell);
+ return ell;
+}
+
+SCM
+Context_def::lookup (SCM sym) const
+{
+ if (scm_is_eq (ly_symbol2scm ("default-child"), sym))
+ return default_child_;
+ else if (scm_is_eq (ly_symbol2scm ("consists"), sym))
+ return get_translator_names (SCM_EOL);
+ else if (scm_is_eq (ly_symbol2scm ("description"), sym))
+ return description_;
+ else if (scm_is_eq (ly_symbol2scm ("aliases"), sym))
+ return context_aliases_;
+ else if (scm_is_eq (ly_symbol2scm ("accepts"), sym))
+ return get_accepted (SCM_EOL);
+ else if (scm_is_eq (ly_symbol2scm ("property-ops"), sym))
+ return property_ops_;
+ else if (scm_is_eq (ly_symbol2scm ("context-name"), sym))
+ return context_name_;
+ else if (scm_is_eq (ly_symbol2scm ("group-type"), sym))
+ return translator_group_type_;
+ return SCM_UNDEFINED;
+}
+
+bool
+Context_def::is_alias (SCM sym) const
+{
+ if (scm_is_eq (sym, ly_symbol2scm ("Bottom")))
+ return !scm_is_pair (get_accepted (SCM_EOL));
+
+ if (scm_is_eq (sym, get_context_name ()))
+ return true;
+
+ return scm_is_true (scm_c_memq (sym, context_aliases_));
+}
+
+LY_DEFINE (ly_context_def_lookup, "ly:context-def-lookup",
+ 2, 1, 0, (SCM def, SCM sym, SCM val),
+ "Return the value of @var{sym} in output definition @var{def}"
+ " (e.g., @code{\\paper}). If no value is found, return"
+ " @var{val} or @code{'()} if @var{val} is undefined.")
+{
+ LY_ASSERT_SMOB (Context_def, def, 1);
+ Context_def *cd = unsmob_context_def (def);
+ LY_ASSERT_TYPE (ly_is_symbol, sym, 2);
+
+ SCM res = cd->lookup (sym);
+
+ scm_remember_upto_here_1 (def);
+
+ if (SCM_UNBNDP (res))
+ res = SCM_EOL;
+
+ if (scm_is_null (res) && !SCM_UNBNDP (val))
+ return val;
+
+ return res;